Java 按位运算得到负值
我有以下代码:Java 按位运算得到负值,java,Java,我有以下代码: int code = 0x92011202; int a = (code & 0xF0000000) >> 28; int b = (code & 0x0F000000) >> 24; // .. int n = (code & 0x0000000F); 但如果code的最高有效位等于1(从9到F)a为负值。所有其他变量 很好 为什么会发生这种情况?代码的最高有效位表示符号——0表示数字为正,1表示数字为负 如果你只是打
int code = 0x92011202;
int a = (code & 0xF0000000) >> 28;
int b = (code & 0x0F000000) >> 24;
// ..
int n = (code & 0x0000000F);
但如果code
的最高有效位等于1(从9到F)a
为负值。所有其他变量
很好
为什么会发生这种情况?代码的最高有效位表示符号——0表示数字为正,1表示数字为负 如果你只是打印出代码,你会发现它是负数 因为移位运算符考虑了符号(它是有符号移位),所以如果代码为负数,a将得到负值。中对此进行了解释 具体而言: 无符号右移运算符“>>>”将零移到 最左边的位置,而“>>”之后最左边的位置取决于 签名分机 Java使用2s补码变量。关于2s补码,您关心的唯一方面是,如果最左边的位是1,则数字是负数。有符号的位移位保持有符号,因此,如果代码一开始是负数,那么移位后它将保持负数
要修复您的程序,请使用
>
,这是一种逻辑位移位,忽略符号“int”的最大值为2^31-1。0xF0000000是一个负数。任何最高有效位等于1的数字都是负数。这就是Java
(和许多其他语言)如何表示负数,使用最高有效位作为符号位。请参阅:我建议阅读整数表示法。遗憾的是,Java没有无符号整数……另请参阅: