我在测试中面对这段代码。
byte[] bytes = new byte[] { -1, 1, 0x0 };
InputStream in = new ByteArrayInputStream(bytes);
System.out.println(in.read() + in.read() + in.read());
我希望这段代码返回0(-1 + 1 + 0),但它返回256。
我很纳闷。
谁可以解释这个行为?
P.S。
显示第一个语句返回255.为什么?
答案 0 :(得分:2)
请参阅InputStream#read
:
值字节在范围0到255
中作为int返回
尝试打印以下内容,您将理解:
System.out.println(in.read()); //prints 255
System.out.println(in.read()); //prints 1
System.out.println(in.read()); //prints 0
所以256实际上是255 + 1 + 0.
编辑:
read()
方法一次读取一个字节。在Java中,字节在two's complement中以8位表示,如果int
在范围[128,255]中,则转换为byte
将是[-1,-128]。
答案 1 :(得分:2)
尝试使用此代码,您将看到原因。
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class Test006 {
public static void main(String[] args) throws Exception {
byte[] bytes = new byte[] { -1, 1, 0x0 };
InputStream in = new ByteArrayInputStream(bytes);
System.out.println(in.read());
System.out.println(in.read());
System.out.println(in.read());
}
}
第一个数字作为int 255读取,因此总和为256.
值-1看起来像一个字节 1111 1111
显然,当它作为int读取时,Java不会添加前导1
(保留将其转换为int -1的符号)但添加
领先的零。所以这个int变成了:
这是int 255而不是-1。
int -1看起来像这样:
1111 1111 1111 1111 1111 1111 1111 1111
所以......这就是int 255的来源。