循环意外的无限字节

Upv*_*ote 34 java byte types for-loop infinite-loop

我有以下循环:

for (byte i = 0 ; i < 128; i++) {
    System.out.println(i + 1 + " " + name);
}
Run Code Online (Sandbox Code Playgroud)

当我执行我的程序时,它会在无限循环中打印-128到127之间的所有数字.为什么会这样?

Vla*_*mir 79

byte是1字节类型,因此可以在-128 ... 127之间变化,因此条件i <128始终为真.当你添加1到127时,它会溢出并变为-128,依此类推(无限)循环......

  • 所以呢?29人不知道这一点,他们通过这个答案开悟了.对他们有好处. (9认同)
  • 这个答案真的值得26投票吗? (6认同)
  • @piemesons - 是的! (5认同)
  • @Coronatus,即使是无符号整数字节也只有0-255.也许你正在考虑到11的旋钮? (3认同)
  • 我会说虽然这是一个基本概念,但它很容易被遗漏,尤其是经验不足的程序员,这个答案是一个简洁明了的解释. (3认同)

Jig*_*shi 20

在127之后,当它递增时,它将变为-128,因此您的条件将不匹配.

byte:byte数据类型是8位有符号二进制补码整数.它具有最小值-128和最大值127(包括).的byte数据类型可以是在大的阵列,其中所述存储器节省实际事项节省存储器是有用的.它们也可用于代替int其限制有助于澄清您的代码; 变量范围有限的事实可以作为一种文档形式.


它会像这样工作:

0, 1, 2, ..., 126, 127, -128, -127, ...
Run Code Online (Sandbox Code Playgroud)

因为8位可以表示最多127个有符号数.

请参阅此处了解原始数据类型.


图片说的不仅仅是文字 替代文字

  • 126,127,-128,-127,......你错过了一个. (2认同)

pax*_*blo 11

因为字节是用Java签名的,所以它们总是小于128.

为什么Java选择带符号的字节从时间的深处是一个谜.我从来没有理解为什么他们损坏了一个非常好的无符号数据类型:-)

试试这个:

for (byte i = 0 ; i >= 0; ++i ) {
Run Code Online (Sandbox Code Playgroud)

或者,更好的是:

for (int i = 0 ; i < 128; ++i ) {
Run Code Online (Sandbox Code Playgroud)


Ita*_*aro 7

因为当i == 127并且你执行i ++时它会溢出到-128.


Cur*_*urd 6

类型字节的范围是-128..127.所以i总是少于128.