您好,我正在学习 Java 编程,我的书中刚刚有一项任务,将 int 变量转换为 byte 变量
byte b;
int i=257;
当我将 int 转换为 b
b=(byte) i;
输出为 1 ? 当字节变量的值从 -128 变为 127 时,它怎么会是一个在我的书中,他们说字节变量的有效范围为 256?
您好,我正在学习 Java 编程,我的书中刚刚有一项任务,将 int 变量转换为 byte 变量
byte b;
int i=257;
当我将 int 转换为 b
b=(byte) i;
输出为 1 ? 当字节变量的值从 -128 变为 127 时,它怎么会是一个在我的书中,他们说字节变量的有效范围为 256?
257 == 00000000000000000000000100000001 (as integer which holds 32 bits)
1 == 00000001 (byte holds only 8 bits)
因为它可以存储从 -128 到 127 的任何数字。一个字节总是用 Java 签名的。您可以通过将其与 0xFF 进行二进制与运算来获得其无符号值。
例子:
int i = 234;
byte b = (byte) i;
System.out.println(b); // -22
int i2 = b & 0xFF;
System.out.println(i2); // 234
这里的关键是看位。
int i = 257
给我们这组位(去掉前导零):
b100000001
该值需要 9 位来保存(int
有 32 位,所以有足够的空间)。当你这样做时b = (byte)i
,它是一个截断的演员表。这意味着只有字节(八位)可以保存的内容被复制到它。所以这给了我们低八位:
b00000001
...这是价值1
。
的范围256
是因为它可以存储从一路到的任意数字 。这两个数字的差是。由于出现了的值,您尝试存储无法用位和符号位准确表示的值。-128
127
256
1
overflow
7
1
这是因为字节范围是从-128到+127
请检查此链接为什么字节从-128 到 127
-128 0 127
, 所以范围是 256。
-2^7 to 2^7-1