理解这个程序中的铸造

时间:2011-05-03 10:53:34

标签: java logic

byte b = 5;
byte c = ~5;

此代码如果用java编写,则会产生无法从int转换为byte的错误。 如果我这样做

int c = ~5;

它给了-6结果然而我期待3.原因是什么,我怎么能不做到3结果。

4 个答案:

答案 0 :(得分:2)

你得到一个负数而不是正数,因为字节基元(如短,int,long等)是有符号的 - 因此最重要的位被翻转所以它代表一个负数(使用{{ 3}}。)反转正数上的所有位,它将变为负数(反之亦然。)

那就是说,如果没有,你就不会得到3 - 5是二进制的101,这将产生010(2,而不是3)。

至于为什么必须将它放入int中,因为JLS声明所有整数算术的返回类型都是“至少”一个int。这与你byte b = 1+1的原因相同,即使结果显然适合一个字节,它仍然无法正常工作。

答案 1 :(得分:2)

我不明白这个错误。

00000000 00000000 00000000 00000101 => 5
Applying the "~" operator:
11111111 11111111 11111111 11111010 => -6 in the complement 2.

你冷酷的做法是,但不是很好,只是为了解问题:     字节c =(字节)(0xFF)& 〜5;

11111111 11111111 11111111 11111010 => -6 
Applying & 0xFF
00000000 00000000 00000000 11111111                                           
Results:
00000000 00000000 00000000 11111010 => 250 
So you cast to byte:
-------- -------- -------- 11111010 => -6

一个简单的:     字节c =(字节)~5; 可以解决你的问题。

答案 2 :(得分:1)

代码

byte b = 5;

的简写
byte b = (byte) 5;

它为您执行转换,因为它是编译器在编译时可以计算的常量表达式。

另外

byte b = ~5;

甚至

final int i = 5;
byte b = ~i;

编译好。注意:如果i不是最终的,则第二行不会编译。


计算负数与补数和加1相同。

neg(a)= comp(a)+ 1或-a = ~a + 1或~a = -a - 1

所以你会期望~5为-5 - 1 = -6。

答案 3 :(得分:0)

5的位表示为00000101 然后〜5是11111010

它的2的补码是00000110,它的位表示为6,而11111010的位表示为-6。