有符號和無符號資料類型的範圍

有符號和無符號資料類型的範圍

那如果char是的1 byte話它就是8位,對吧?

那麼2^8=256,0到255就是char的範圍?

這如何處理有符號和無符號整數?一個 int 是 4 個字節,所以 32 位,所以2 ^ 32. 2 ^ 31 - 1 給出有符號整數的正範圍,那麼第 32 位元會發生什麼事?是用來做標誌的嗎?一個符號如何儲存在記憶體中?

答案1

如果資料類型被定義為有符號類型,則有不同類型的表示形式 - 主要是有符號數值表示形式和二進制補碼表示形式。

對於帶符號的幅度表示,是的,符號位元被儲存為最高有效位元(MSB,即最左邊的位元)。 MSB 為 0 表示正數,1 表示負數。例子:

 7 = 00000111
-7 = 10000111

這很簡單並且(相對)人類可讀,但是整數類型通常是不是保持這種方式有兩個問題:

(1) 零有兩種表示方式:+0 和-0。由於它創建了一個特殊情況,因此比較數字變得非常麻煩。

(2)計算不方便(簡單的加減法)。兩個正數相加、正數加負數、負數加正數、兩個負數相加是四種不同的用例。例如 7+6 是直接的

          1   Carry bit
 7 = 00000111
 6 = 00000110  (Logic for add)
..   ........
13 = 00001101

計算 7+(-6) 時表示要使用減法邏輯

 7 = 00000111
-6 = 10000110  (Logic for subtraction)
..   ........
 1 = 00000001

因此,8 位數字的範圍是 -(2^7)+1 到 2^7-1(即 -127 到 +127,其中有兩個零 +0 和 -0)。有符號幅度表示主要用於保存浮點數。

這導致了二進制的補碼表示。正數的表示方式與符號大小的表示方式相同。更改符號位元需要兩個步驟: (1) 反轉所有位元(將所有 0 變更為 1,將 1 變更為 0) (2) 加 1。

例如,要獲得 -6 的表示,我們採取以下步驟

 6 = 00000110
 Invert all bits:  11111001
 Add one: 11111010

所以-6 表示為11111010。使用二進位補碼表示法,您仍然可以從 MSB 讀取符號;而零只有一種表示形式:00000000

用二進制補碼表示的二進制數來計算也很容易——加法就是加法。讓我們再看看如何計算 7+(-6):

     1111111   Carry bit
 7 = 00000111
-6 = 11111010  (Logic for add)
..   ........
 1 = 00000001

因此,8 位數字的範圍是 -(2^7) 到 2^7-1(即 -128 到 +127)。請注意,該範圍與帶符號的幅度表示不同。

相關內容