java - 为什么这个字节没有异常?

时间:2017-08-16 12:44:28

标签: java primitive

我按如下方式初始化了一个字节:

byte b = (byte) 0b11110000000;

由于一个字节是8位大小,我原以为它会引发一些异常或错误,因为这个数字应该只能分配给short或者以上。它还评估为-124?或者这可能是"正常"行为? (没有异常抛出,但变量溢出)?

5 个答案:

答案 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