Java 字节a=123;字节b=5字节c=(字节)(a+;b);给-128。为什么会发生这种情况?
,为什么会发生这种情况?为什么要用二者的互补方式来显示值Java 字节a=123;字节b=5字节c=(字节)(a+;b);给-128。为什么会发生这种情况?,java,binary,decimal,twos-complement,Java,Binary,Decimal,Twos Complement,,为什么会发生这种情况?为什么要用二者的互补方式来显示值 byte a=123; byte b=5; byte c=(byte)(a+b); System.out.println(c); 一个byte是8bit可以容纳2^8=256个值,首先7b表示值,1b表示符号,所有这些都以2-complete的方式: -128, -127, ... 0, 1, 2 ..., 126, 127 当您设置为127,并且执行+1时,由于bonary操作,它会返回范围的第一个值 01111110 126 0
byte a=123;
byte b=5;
byte c=(byte)(a+b);
System.out.println(c);
一个
byte
是8bit
可以容纳2^8=256
个值,首先7b
表示值,1b
表示符号,所有这些都以2-complete
的方式:
-128, -127, ... 0, 1, 2 ..., 126, 127
当您设置为127
,并且执行+1
时,由于bonary操作,它会返回范围的第一个值
01111110 126
01111111 127
10000000 -128
10000001 -127
当您达到
Integer.MAX\u值时,int
也会发生同样的情况
System.out.println(Integer.MAX_VALUE + 1); // -2147483648
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); // true
字节范围为-128到127。以下是将一个添加到最大字节范围时发生的情况:
0 1 1 1 1 1 1 1 --> 127
+ 0 0 0 0 0 0 0 1 --> 1
------------------
1 0 0 0 0 0 0 0 --> -128
请注意,最左边的位是符号位,由于设置了符号位,您可以通过2的补码获得变量的值。字节数据类型的最小值为-128(-2^7)
和最大值为127(=2^7-1)
加法(a+b)
产生结果:
128
(对于int
数据类型,二进制10000000
),因为它被转换为int
,
但是铸造(byte)(a+b)
将其压缩回1个字节,得到
-128
(二进制10000000
,用于字节
数据类型)。字节的最大值为127,因此如果添加一个,它从频谱的另一端开始,这是字节的最小值,这是-128。因为字节的有效范围是-128
到127
。不是128
<代码>System.out.println((字节)128)代码>当您查看答案时,请考虑投票赞成/接受一个;)