Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按位运算得到负值_Java - Fatal编程技术网

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没有无符号整数……另请参阅: