byte b = 5;
byte c = ~5;
此代码如果用java编写,则会产生无法从int转换为byte的错误。 如果我这样做
int c = ~5;
它给了-6结果然而我期待3.原因是什么,我怎么能不做到3结果。
答案 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。