簡體   English   中英

Java中負整數的二進制表示

[英]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 也會是100010

謝謝

你對這些負數應該是什么樣子的理解是有缺陷的。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM