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)当您查看答案时,请考虑投票赞成/接受一个;)