使用NOT运算符时的字节转换

时间:2014-01-05 13:49:06

标签: java types casting

为什么我需要在此示例中使用变量转换?

byte b = -123;
b = (byte) ~b;

当我尝试编译它而不进行强制转换时,我得到:

NotDemo.java:17: error: possible loss of precision

2 个答案:

答案 0 :(得分:4)

因为~b会在应用〜。

之前将b转换/提升为int

实际上无形的事情是这样的。

~((int)b);

所以结果是int。

所以你需要把回送到字节。

有关详细信息,请参阅JLS。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.15.5

答案 1 :(得分:4)

因为对于大多数Java运算符(包括~),在应用运算符之前整数操作数为promoted。因此byte被提升为int;你的代码等同于:

b = (byte) ~((int) b);

因此,通常,分配回byte将丢失高位信息。 (虽然在这种情况下它毫无意义。)