【问题标题】:byte a=123; byte b=5 byte c= (byte)(a+b); gives -128. Why does this really happen? [duplicate]字节a=123;字节 b=5 字节 c= (字节)(a+b);给出-128。为什么这真的会发生? [复制]
【发布时间】:2019-04-08 04:05:14
【问题描述】:

https://www.ideone.com/gYreaO ,为什么会发生这种情况?为什么要采用二进制补码的方式来显示值?

byte a=123;
byte b=5;
byte c=(byte)(a+b);
System.out.println(c);

【问题讨论】:

  • byte 的最大值是 127,所以如果加一个,它会从频谱的另一侧开始,也就是 byte 的最小值,即 -128。跨度>
  • 因为byte 的有效范围是-128127。不是128System.out.println((byte) 128);
  • 当你看到答案时,想想投票/接受一个;)

标签: java binary decimal twos-complement


【解决方案1】:

byte8bit 可以保存2^8 = 256 值,首先7b 用于值,1b 用于符号,全部以2-complement 方式:

-128, -127, ... 0, 1, 2 ..., 126, 127

当你是127,并且你做+1时,由于二元运算,它会返回范围的第一个值

01111110  126
01111111  127
10000000 -128
10000001 -127

Code demo


当您到达Integer.MAX_VALUE 时,int 也会发生完全相同的情况

System.out.println(Integer.MAX_VALUE + 1);                      // -2147483648
System.out.println(Integer.MAX_VALUE + 1 == Integer.MIN_VALUE); // true

【讨论】:

    【解决方案2】:

    字节范围是 -128 到 127。当您将最大字节范围加 1 时会发生以下情况:

      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
    

    请注意,最左边的位是符号位,由于设置了符号位,您可以通过二进制补码得到变量的值。

    【讨论】:

      【解决方案3】:

      byte 数据类型具有最小值 -128(=-2^7) 和最大值 127(=2^7-1)
      加法 (a+b) 产生结果:
      128int 数据类型的二进制 10000000)因为它被转换为 int
      但是转换 (byte)(a+b) 将其压缩回 1 个字节,您会得到
      -128(byte 数据类型的二进制 10000000)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 2018-04-11
        • 1970-01-01
        • 2021-10-06
        相关资源
        最近更新 更多