幕布斯6054654
2023-03-17 16:21:57
我有以下價值:int x = -51232;Java 整數是 32 位的,所以在二進制中應該是這樣的:10000000000000001100100000100000左邊的符號位設置為1因為x是負數。然后我做手術x = (x & Integer.MAX_VALUE);Integer.MAX_VALUE是2147483647并且在二進制中是:01111111111111111111111111111111左側為 0,因為值為正。那么為什么x & Integer.MAX_VALUEyield呢2147432416?運算AND符應該只檢索x和Integer.MAX_VALUE共有的位,這應該等同于-x(因為它們不共享相同的符號位)。這里發生了什么?
2 回答

瀟湘沐
TA貢獻1816條經驗 獲得超6個贊
你的誤解是由于缺乏關于負整數在 Java 中如何用二進制表示的知識造成的。您應該閱讀 2 的補碼。
10000000000000001100100000100000不是的二進制表示-51232。
11111111111111110011011111100000是。
當你按位運行 AND 時,你會得到:
11111111111111110011011111100000 (-51232)
01111111111111111111111111111111 (Integer.MAX_VALUE)
--------------------------------
01111111111111110011011111100000 (2147432416)
下面是 -51232 的二進制表示,旁邊是 51232 的二進制表示。您可以看到它們的和是 2 32。int對于任何一對sx和,2 的補碼總是這種情況-x。
00000000000000001100100000100000 (-51232)
11111111111111110011011111100000 (51232)
添加回答
舉報
0/150
提交
取消