我按如下方式初始化了一个字节:
byte b = (byte) 0b11110000000;
由于一个字节是8位大小,我原以为它会引发一些异常或错误,因为这个数字应该只能分配给short或者以上。它还评估为-124?或者这可能是"正常"行为? (没有异常抛出,但变量溢出)?
答案 0 :(得分:6)
你应该得到-128
。
当您明确地将int
强制转换为byte
时,将获取最低的8位,其余的将被丢弃。
在您的示例中,最低8位为10000000
,该数字的小数值为-128
。
如果没有明确的演员表,代码就不会通过编译,因为你的作业会导致信息丢失。
答案 1 :(得分:1)
如果你想看到错误,请摆脱演员。
byte b = 0b11110000000;
这将为您提供“不兼容的类型:从int到byte的可能有损转换。”
由于您使用(byte)
显式地转换了该值,因此Java编译器会假设您知道自己在做什么。
答案 2 :(得分:0)
这里:
byte b = (byte) 0b11110000000;
0b11110000000
是一个int
字面,缩小转换为byte
。
一个字节是一个8位带符号的二进制补码整数 其最小值为-128,最大值为127 字节表示的最大值是
1111111
并且
10000000
溢出最大值1。
因此,它溢出到下一个值,即字节的最小值:-128
答案 3 :(得分:0)
记住你在施展:
(byte) 0b11110000000;
在(MSB)之后的所有其他内容将被丢弃...
这意味着:alll以下字节初始化将被标记为-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);
答案 4 :(得分:0)
我认为它叫做加宽原始转换。
5.1.2。扩大原始转换
对原始类型的19个特定转换称为扩展原语转换:
byte to short,int,long,float或double
有关详情,请参阅此链接: https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html