我初始化的字节如下:java - 为什么这个字节不会引起异常?
byte b = (byte) 0b11110000000;
因为一个字节是大小的8位,我期待它会抛出一些异常或错误,因为这数量应该是分配仅一个短或以上。它仍评估为-124?或者这也许是“正常”的行为? (没有异常抛出,但变量溢出)?
我初始化的字节如下:java - 为什么这个字节不会引起异常?
byte b = (byte) 0b11110000000;
因为一个字节是大小的8位,我期待它会抛出一些异常或错误,因为这数量应该是分配仅一个短或以上。它仍评估为-124?或者这也许是“正常”的行为? (没有异常抛出,但变量溢出)?
你应该得到-128
。
当您明确地将int
转换为byte
时,将采用最低8位,其余部分将被丢弃。
在你的例子中,最低的8位是10000000
,那个数字的十进制值是-128
。
如果没有显式强制转换,代码将无法通过编译,因为您的任务会导致信息丢失。
这里:
byte b = (byte) 0b11110000000;
0b11110000000
为int
字面即正在缩小转换为byte
。
一个字节是一个8位带符号的二进制补码整数。
其最小值为-128其最大值为127
字节表示的最大值是
1111111
而且
10000000
溢出的1 最大值所以,溢出到字节最小值的下一个值:-128
请记住,您正在播放:
(byte) 0b11110000000;
一切后(MSB)的8位将被丢弃...
这意味着:alll后面的字节初始化将被trucated -128(1000_0000或第一次8位)
byte b = (byte) 0b1000_0000;
System.out.println(b);
b = (byte) 0b1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1111_1000_0000;
System.out.println(b);
b = (byte) 0b1111_1111_1111_1111_1111_1111_1000_0000;
System.out.println(b);
// even here with longs as bin
b = (byte) 0b1111_1111_1111_1111_1111_1111_1111_1000_0000L;
System.out.println(b);
如果你想看到错误,摆脱演员阵容。
byte b = 0b11110000000;
这会给你“不兼容的类型:可能有损从int转换为字节。”
由于您明确将该值与(byte)
一起转换,因此Java编译器假定您知道自己在做什么。
我认为它被称为加宽原始转换。
5.1.2。宽元转换
19对原始类型特定的转换被称为宽元的转换:
字节short,int和长整型,浮点或双
有关详细信息,您可以参考以下链接: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
所以是的:这是“正常*”的行为。但我不知道他们为什么这样设计,任何人都有想法? – Zabuza
@Zabuza好吧,如果你只对'int'的最低8位感兴趣,你可以使用这个显式类型将它们分配给一个'byte'。就像如果你只对'float'的double类型的整数部分感兴趣的话,你可以明确地将它转换为int(或'long')并丢弃小数部分。 – Eran
啊,通过比较它听起来有意义。 – Zabuza