java中的转换和转换是如何发生的?

java中的转换和转换是如何发生的?,java,implicit-conversion,Java,Implicit Conversion,该代码的输出分别为-1和0。 它们不应该分别为127和-128,因为这是字节变量可以容纳的范围。我是编程新手,所以在转换过程中遇到了问题。计算机是二进制的。他们把东西零零碎碎地储存起来。他们还使用一种叫做二的补语。位是0或1 当你数数的时候,你会数到01 2 3 4 5 6 7 8 9 10。10是奇怪的。为什么“我们”决定切换到两个符号,重新使用以前的数字?因为我们有10个手指。实际上,计算机有两种功能。他们用同样的方式计算,只是,他们的第二个数字“我们”称之为“2”,是指计算机决定重复使用数

该代码的输出分别为-1和0。
它们不应该分别为127和-128,因为这是字节变量可以容纳的范围。我是编程新手,所以在转换过程中遇到了问题。

计算机是二进制的。他们把东西零零碎碎地储存起来。他们还使用一种叫做二的补语。位是0或1

当你数数的时候,你会数到01 2 3 4 5 6 7 8 9 10。10是奇怪的。为什么“我们”决定切换到两个符号,重新使用以前的数字?因为我们有10个手指。实际上,计算机有两种功能。他们用同样的方式计算,只是,他们的第二个数字“我们”称之为“2”,是指计算机决定重复使用数字,就像我们没有一个数字表示“10”。因此,计算机可以运行011100101111000,等等

位只存储0或1,因此没有空间存储-或;您必须将其编码为0或1

二的补码是一种存储负数的奇特方式。规则是:翻转每一位,然后添加1。所以,给定一个字节8位,把,比如说,二进制为0000 0101的数字“3”转换成-3,翻转每一位,加1:1111010,然后加1:1111011

这个“奇怪”的系统有一个非常有趣的特性,就是你必须对位进行运算,特别是算术,如果是有符号的或无符号的,那么加法和减法就不会给出一个垃圾。计算机只知道你有一个字节,这个字节中的位是1111011。这是计算机所知道的全部。如果你打印它,它会打印“-3”?这是人类的便利。prints-3的原因仅仅是因为java定义字节被认为是“有符号的”。注意1111011也意味着253。是同一个号码。试试看:

class Example{
    public static void main(String args[]){
        int x;
        byte b;
        x=Short.MAX_VALUE;
        b=(byte)x;
        System.out.println(b);
        
        x=Short.MIN_VALUE;
        b=(byte)x;
        System.out.println(b);

    }
}
这意味着最大的空头是0111111111111111。为什么?因为如果最左边的“最高”位是1,它将是一个负数

如果将其设为一个字节,只需去掉前8位,只留下1111111。这是一个负数,第一位是1,所以是负数。要把它变成正数,二的补码规则是双向的。翻转所有位和1。翻转所有位使其为0000,添加1:0000 0001。这是1。1111111是-1,这就是为什么你的第一个println打印-1

类似地,Short.MIN_值为-32768。以位表示,这是1000万。使用byte thatNumber将其转换为一个字节,这样就去掉了所有的位,除了最右边的8位,它们都是零

您可以在web(如wikipedia)上搜索2的补码以获取更多信息。

请检查将int或short转换为byte时的精度最低为8位。
byte b = (byte) 253;
System.out.println(b); // prints -3