[英]Binary presentation of negative integer in Java
請幫助我理解負整數的二進制表示。
例如,我們有 5。 5 的二進制表示是00000000.00000000.00000000.00000101
。
據我所知 -5 的二進制表示應該是10000000.00000000.00000000.00000101
。
但輸出是11111111.11111111.11111111.11111011
。
我有兩個問題:
1) 為什么這里有這么多1
位。
2)我真的無法理解最后3位011
。 它看起來像3
。 即使是 +1 或 -1 也會是100
或010
謝謝
你對這些負數應該是什么樣子的理解是有缺陷的。 Java 對負數使用二進制補碼,基本規則是取正數,反轉所有位然后加一。 這讓你感到消極。
因此,正如您所說,五是:
0000...00000101
反轉給你:
1111...11111010
然后添加一個給出:
1111...11111011
您為-5
顯示的位模式稱為符號/幅度,您只需翻轉最左邊的位即可否定一個數字。 這在 C 實現中允許作為三種可能性(a) 之一,但 Java 僅使用二進制補碼(對於其負整數)。
(a)但請記住,C 和 C++ 目前都在努力刪除其他兩種編碼類型並只允許二進制補碼。
據我所知 -5 的二進制表示應該是
10000000.00000000.00000000.00000101
。
如果 Java 對整數使用Sign 和 Magnitude表示,那將是正確的。 但是,Java 使用Two's Complement表示法,因此其余位會根據該表示法的規則進行更改。
二進制補碼表示背后的想法是,當您將這種表示中的一個數字與另一個值相加時,刪除最高有效端的額外位,結果就好像您減去了相同數量級的正數。
你可以用十進制數來說明這一點。 在兩位數表示中,值 99 的行為類似於 -1,98 的行為類似於 -2,97 的行為類似於 -3,依此類推。 例如,如果您刪除23 + 99 = [1]22
的最高數字,則 99 的行為類似於 -1。 23 + 98 = [1]21
,所以 98 表現得像 -2。
這與二進制數的二進制補碼表示方式相同,只是您將刪除頂部的額外位。
http://en.wikipedia.org/wiki/Two%27s_complement
負數的存儲方式是最高有效位(例如,對於 32 位數字表示 2^31 的位)被視為負數。 所以如果你存儲了所有的 1,你會加起來
(-2^31) + 2^30 + 2^29 + ... + 2^1 + 2^0
這使得-1
。
在這種表示下,小的負數將主要是負數。
以下是 2 的贊美示例:
如果您有 -30,並且想用 2 的補碼表示它,則采用 30 的二進制表示:
0000 0000 0000 0000 0000 0000 0001 1110
反轉數字。
1111 1111 1111 1111 1111 1111 1110 0001
並加一個。
1111 1111 1111 1111 1111 1111 1110 0010
轉換回十六進制,這是 0xFFFFFFE2。 事實上,假設你有這個代碼:
#include <stdio.h>
int main() {
int myInt;
myInt = 0xFFFFFFE2;
printf("%d\n",myInt);
return 0;
}
那應該產生-30的輸出。 喜歡就試試吧。
對於二進制補碼,MSB 為 1 表示負數是正確的。 但其余位不是其值的二進制表示。 另一方面,如果 MSB 為 0,則其余位表示二進制值。 但不能說這個數字是正數。 零既不是正也不是負。
當我開始了解到數字的表示比 0..9 多時,這張圖幫助我理解了原理:
0
-1 000 1
111 001
-2 110 010 2
101 011
-3 100 3
-4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.