那如果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)。請注意,該範圍與帶符號的幅度表示不同。