我有一些代码每次通过循环时都会将字节增加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?
答案 0 :(得分:12)
有没有人知道为什么它会在120后开始倒计时而不是上升到256?
是。 Java字节是签名的 - 就这么简单。来自section 4.2.1 of the JLS:
整数类型的值是以下范围内的整数:
- 对于字节,从-128到127,包括
- ...
将字节值显示为无符号的最简单方法是将其提升为int
并使用0xff屏蔽它:
System.out.print((b & 0xff) + " ");
答案 1 :(得分:3)
字节是从-128到+127的带符号数量。一旦达到127,它就会回到最低点。
答案 2 :(得分:3)
因为它不适合字节范围。 byte
的范围是-128到+127。字节数据类型是 8位有符号二进制补码整数。它的最小值为-128,最大值为127(含)从JLS 4.2.1:
对于字节,从-128到127,包括
因此,128
中的值-128
实际上是byte
。
答案 3 :(得分:0)
这是因为一个字节只能存储8位信息,即2 ^ 8 = 256个值,128个负数,零个和127个正数,并且它包含在内。如果需要最多256个,请使用int
,否则如果内存使用很重要,请使用字节从-127到128计数。