計算機中帶符號的整數都是用的二進制的補碼,這點我們需要明確。那爲什麼計算機存儲要用補碼而不直接用原碼,其實就是爲了計算機自己方便運算,後面會介紹。
計算機中表示-128 ~ 127的格式如下:
0000 0000 0
0000 0001 1
…… ……
0111 1111 127
1000 0000 -128
1000 0001 -127
…… ……
1111 1111 -1
上面的二進制都是補碼,它們是在計算機中的表示形式。
因爲最高位是符號位,0表示正數,1表示負數
正數的補碼和原碼,反碼相同,所以我們會很容易的知道 0111 1111 是127
那負數呢
比如1111 1111爲什麼是-1而不是-127
我們知道1111 1111 是補碼,如果我們想要知道它的真實身份,就需要求它的原碼
1111 1111 減 1得到反碼 1111 1110 反碼除了符號位 其餘按位取反 得到1000 0001 現在我們就知道原來它的真實身份是-1
這裏有一個特殊情況就是 1000 0000 爲什麼是-128 我們會發現求它的原碼好像不好求 會出現錯誤 其實我們可以反證得到其實1000 0000 的補碼和原碼是一樣的
這裏就會有人問1000 0000 不是表示 -0 嗎?也許你是對的,但是我們已經有0000 0000 表示0 了 ,0的正負其實是沒有意義的,所以我們就無須弄兩個0出來,所以1000 0000 的最高位既是符號位也是數值位 表示 -128, 這是個特殊。
其實一個字節表示的數是256個 而-128 ~ 127 剛好是256個 說到這裏大家有沒有理解呢?
現在我們再說說爲什麼計算機要用補碼錶示一個數,我們舉個例子
如果計算機用原碼錶示數據 則 -1 = 1000 0001 1 = 0000 0001
-1 + 1 = 1000 0001 + 0000 0001 = 1000 0010 = -2 ??? 不是等於0 嗎,怎麼會是-2 ,這就是計算機用原碼錶示時進行加減運算出的錯誤
我們再看看補碼的形式 -1 = 1111 1111 1 = 0000 0001
-1 + 1 = 11111111 + 0000 0001 = 0000 0000 =0 我們可以看到結果是正確的
我們再舉個例子 如果計算機用原碼錶示數據 1 = 0000 0001 -2= 1000 0010
1 + (-2)= 0000 0001 + 1000 0010 = 1000 0011 = -3 這顯然是錯的
如果計算機用補碼錶示數據 1 = 0000 0001 -2 = 1111 1110
1 + (-2)= 0000 0001 + 1111 1110 = 1111 1111 = -1
我們知道1111 1111它其實是補碼,它表示的就是 -1
寫到這裏大家應該已經大致明白我的意思了,當然還有一些比較特殊的情況需要大家自己琢磨,而且由於自己水平有限,可能有些不正確的說法,還需要大家指出批評。