【发布时间】:2011-05-03 10:53:33
【问题描述】:
byte b = 5;
byte c = ~5;
如果用 java 编写此代码会产生无法从 int 转换为 byte 的错误。 如果我这样做了
int c = ~5;
结果为 -6,但我期望为 3。原因是什么,我该如何做才能不达到 3。
【问题讨论】:
-
你为什么期望 ~5 给 3?
byte b = 5;
byte c = ~5;
如果用 java 编写此代码会产生无法从 int 转换为 byte 的错误。 如果我这样做了
int c = ~5;
结果为 -6,但我期望为 3。原因是什么,我该如何做才能不达到 3。
【问题讨论】:
您得到的是负数而不是正数,因为字节原语(如 short、int、long 等)已签名 - 因此最高有效位被翻转,因此它表示负数(使用 @987654321 @.) 反转一个正数的所有位,它会变成负数(反之亦然。)
也就是说,如果没有,您无论如何都不会得到 3 - 5 在二进制中是 101,这将产生 010(2,而不是 3。)
至于为什么必须将它放入 int 中,这是因为 JLS 声明所有整数算术都有一个“至少”一个 int 的返回类型。这与您执行 byte b = 1+1 的原因相同,即使结果明显适合一个字节,它仍然无法正常工作。
【讨论】:
1+1 是一个常量表达式)。 byte b = 1; b = 1+b; 将不会编译。
我不明白这个错误。
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; 可以解决你的问题。
【讨论】:
代码
byte b = 5;
是简写
byte b = (byte) 5;
它为您进行转换,因为它是编译器可以在编译时评估的常量表达式。
还有
byte b = ~5;
甚至
final int i = 5;
byte b = ~i;
编译好。注意:如果i 不是final,则第二行不会编译。
计算负数与取补加1相同。
neg(a) = comp(a) + 1 或 -a = ~a + 1 或 ~a = -a - 1
所以你会认为 ~5 是 -5 - 1 = -6。
【讨论】:
~5 是一个常量表达式,就像5 一样。
5的位表示为00000101 那么 ~5 是 11111010
它的 2 的补码是 00000110,它是 6 的位表示,11111010 是 -6 的位表示。
【讨论】: