我有这段代码:
int code = 0x92011202;
int a = (code & 0xF0000000) >> 28;
int b = (code & 0x0F000000) >> 24;
// ..
int n = (code & 0x0000000F);
但如果code
的最高有效位等于1(从9到F)a
为负值。所有其他变量
工作正常。
为什么会这样?
答案 0 :(得分:5)
The Java Tutorials中解释了这一点。
具体来说:
无符号右移运算符">>>"将零转换为 最左边的位置,而在">>"之后的最左边的位置依赖于取决于 签署延期。
Java使用2s补码变量。你关心的2s补充的唯一方面是,如果最左边的位是1,则数字是负数。带符号的bitshift保持符号,因此如果代码为负值,则在移位后保持为负。
要修复程序,请使用>>>
代替逻辑位移,忽略符号
答案 1 :(得分:0)
最重要的代码代表符号 - 0表示数字为正数,1表示数字为负数。
如果你打印出代码,你会发现它是否定的。
由于班次操作员考虑了符号(它是有符号的班次),如果代码为负,则a将得到负值。
答案 2 :(得分:-1)
“int”的最大值是2 ^ 31-1。 0xF0000000是负数。任何最高有效位等于1的数字都是负数。