2017-08-16 326 views
3

我初始化的字节如下:java - 为什么这个字节不会引起异常?

byte b = (byte) 0b11110000000; 

因为一个字节是大小的8位,我期待它会抛出一些异常或错误,因为这数量应该是分配仅一个短或以上。它仍评估为-124?或者这也许是“正常”的行为? (没有异常抛出,但变量溢出)?

回答

6

你应该得到-128

当您明确地将int转换为byte时,将采用最低8位,其余部分将被丢弃。

在你的例子中,最低的8位是10000000,那个数字的十进制值是-128

如果没有显式强制转换,代码将无法通过编译,因为您的任务会导致信息丢失。

+0

所以是的:这是“正常*”的行为。但我不知道他们为什么这样设计,任何人都有想法? – Zabuza

+0

@Zabuza好吧,如果你只对'int'的最低8位感兴趣,你可以使用这个显式类型将它们分配给一个'byte'。就像如果你只对'float'的double类型的整数部分感兴趣的话,你可以明确地将它转换为int(或'long')并丢弃小数部分。 – Eran

+0

啊,通过比较它听起来有意义。 – Zabuza

0

这里:

byte b = (byte) 0b11110000000; 

0b11110000000int字面即正在缩小转换为byte

一个字节是一个8位带符号的二进制补码整数。
其最小值为-128其最大值为127
字节表示的最大值是

1111111 

而且

10000000 

溢出的1 最大值所以,溢出到字节最小值的下一个值:-128

0

请记住,您正在播放:

(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); 
1

如果你想看到错误,摆脱演员阵容。

byte b = 0b11110000000; 

这会给你“不兼容的类型:可能有损从int转换为字节。”

由于您明确将该值与(byte)一起转换,因此Java编译器假定您知道自己在做什么。

相关问题