6

我有一些代码每次通过我的循环时都会将一个字节增加 8 位。一切都按预期进行,直到我达到 120,然后我的数字突然变为负数。

代码:

byte b = 0;

for(int i = 0; i < 0x100; i += 8) {
    System.out.print(b + " ");
    b += 8;
}

输出:

0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 -128 -120 -112 -104 -96 -88 -80 -72 -64 -56 -48 -40 -32 -24 -16 -8

我想看到的:

0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 128 136 144 152 160 168 176 184 192 200 208 216 224 232 240 248 256

有谁知道为什么它在 120 之后开始倒计时而不是上升到 256?

4

4 回答 4

13

有谁知道为什么它在 120 之后开始倒计时而不是上升到 256?

是的。Java 字节是有符号的——就这么简单。从JLS 的第 4.2.1 节

整数类型的值是以下范围内的整数:

  • 对于字节,从 -128 到 127(含)
  • ...

将字节值显示为无符号的最简单方法是将其提升为int0xff 并将其屏蔽:

System.out.print((b & 0xff) + " ");

&操作员将自动执行二进制数字提升。)

于 2013-07-05T07:21:43.617 回答
3

一个字节是一个有符号的数量,范围从 -128 到 +127。一旦达到 127,它就会回到最低负值。

于 2013-07-05T07:21:47.210 回答
3

因为它不适合 byte 的范围。的范围byte是从 -128 到 +127 。字节数据类型是一个8 位有符号二进制补码整数。它的最小值为 -128,最大值为 127(含)来自JLS 4.2.1

对于字节,从 -128 到 127(含)

因此该值128实际上-128byte.

于 2013-07-05T07:21:50.667 回答
0

那是因为一个字节只能存储 8 位信息,即 2^8 = 256 个值,128 个负值,0 和 127 个正值,并且它会回绕。int如果您需要增加到 256,请改为使用,否则如果内存使用很重要,请使用您的字节从 -127 计数到 128。

于 2013-07-05T07:22:37.417 回答