將8位元有號整數 −8(1111 1000)以算術右移向右移1位元的結果為下列何者?
- A124(0111 1100)
- B−16(1111 0000)
- C−4(1111 1100)
輸入數值並選擇輸入的進位與位元寬度,即可一次看到它的二進位、八進位、十進位與十六進位表示。負數以二補數表示,並同時顯示同一個位元串以無號與有號方式解讀的值、可表示的範圍、全部位元反轉與正負號反轉的結果。也適合在手算數值表示的練習題之後,用來核對答案。
輸入的條件會寫入這個頁面的網址,加入書籤或分享後,就能開啟相同的計算結果。收藏與最近使用的工具只儲存在這個瀏覽器(localStorage)中。
負數以所選位元寬度的二補數表示,輸入中的空白與 _ 會被忽略。
其他輸入維持目前的值,只讓選擇的輸入在目前值的 1/4 到 4 倍之間變化時的結果。紅點是目前的值。
要把十進位轉為二進位,就反覆除以 2,再把餘數由最後一個往回排列。反過來要把二進位轉為十進位,則將每一位乘上 1、2、4、8…的權重後相加。因為 16 是 2 的 4 次方,把二進位從低位開始每 4 位分成一組,每一組正好對應十六進位的一位數(0~9 與 A~F);八進位則是每 3 位一組。預設值 −5 以 8 位元表示為 1111 1011,1111 是 F、1011 是 B,因此十六進位為 0xFB,以無號十進位解讀則是 128 + 64 + 32 + 16 + 8 + 2 + 1 = 251。若每 3 位分成 011 111 011,八進位就是 373。本工具將二進位與十六進位每 4 位分組顯示,方便對照兩者的對應關係。
在 n 位元的二補數中,負數 −x 以 2ⁿ − x 的位元串來表示。將所有位元反轉所得的值(一補數)是 (2ⁿ − 1) − x,再加 1 就正好等於 2ⁿ − x。這就是「反轉後加 1」能讓正負號相反的原因。8 位元的 5 是 0000 0101,反轉後為 1111 1010,加 1 後為 1111 1011,與 256 − 5 = 251 一致。以 2ⁿ 為模數運算的加法器中,加上 2ⁿ − x 與減去 x 的結果相同,因此減法也能用加法器完成,無號數與有號數也能共用同一個電路。工具的「正負號反轉」欄會顯示預設值 −5(1111 1011)反轉後的 0000 0100,以及加 1 後的 0000 0101(+5)。
n 位元的無號整數可表示 0 到 2ⁿ − 1,二補數的有號整數可表示 −2ⁿ⁻¹ 到 2ⁿ⁻¹ − 1。8 位元為 0~255 與 −128~127,16 位元為 0~65535 與 −32768~32767,32 位元為 0~4294967295 與 −2147483648~2147483647。0 位於最高位元為 0 的那一側,因此正數比負數少一個,最小的負數無法反轉正負號。以 8 位元輸入 −128(1000 0000),反轉後為 0111 1111,加 1 後又回到 1000 0000,可在工具中確認它仍是 −128。程式中對最小值取絕對值或乘以 −1 時會發生溢位,就是這個不對稱性造成的。
位元串本身不帶有正負號的資訊,以無號或二補數解讀,得到的值就不同。最高位元為 0 時兩者相同;為 1 時,有號的值等於無號的值減去 2ⁿ。1111 1011 以無號解讀為 251,以有號解讀為 251 − 256 = −5。擴大有號數的位元寬度時,要把最高位元複製到所有新增的高位(符號擴展):−5 在 16 位元為 FFFB,在 32 位元為十六進位的 FFFF FFFB,值仍是 −5。若改以 0 填滿高位(零擴展),則成為 00FB,也就是 251。在工具中維持十進位 −5 並改變位元寬度,可看到符號擴展的結果;輸入十六進位 FB 再改變位元寬度,則可看到零擴展的結果。
n 位元的加法結果是除以 2ⁿ 的餘數,超出的高位會被捨棄。無號加法中,從最高位元向外產生進位(carry)時就是溢位;有號加法中,兩個正數相加得到負數,或兩個負數相加得到正數時才是溢位。以 8 位元輸入 127 + 1 的結果 128,位元串為 1000 0000,以無號解讀是 128,以有號解讀卻是 −128。以 32 位元輸入十進位 −1,無號值為 4294967295,與 C 語言中 32 位元無號整數計算 0 − 1 的結果相同。進位轉換、以二補數表示的負數、n 位元可表示的範圍與位移運算,都是計算機概論與資訊類證照考試的基本題型。輸入超出範圍的值時,本工具只保留低位元並顯示警告,可藉此確認暫存器中實際發生的情形。
正確答案:B. 4294967295
無號整數沒有負數,C語言規定結果以除以 2³² 的餘數處理(繞回)。0 − 1 會成為 2³² − 1 = 4294967295,其位元串全為1。因此,若在無號變數上將「每次減1直到i成為0」的迴圈寫成 i >= 0,條件會恆為真而永遠無法結束。無號數無法表示 −1,也不會停在0(飽和)。
正確答案:C. 查看從最高位元是否有進位溢出到外部
在無號數的加法中,當從最高位元再向上產生進位時,結果就超過了該位元數所能表示的最大值。在CPU中,這個進位會留作進位旗標(carry flag),檢查它即可判定。結果的最高位元為1,只是變成了較大的數,並非位數溢出。比較進位到最高位元與從最高位元進位的差異,是有號數的溢位判定方法。
5 以 8 位元表示為 0000 0101。將所有位元反轉得到 1111 1010,再加 1 得到 1111 1011,十六進位為 0xFB,以無號解讀為 251。用 256 − 5 = 251 計算也會得到相同的位元串。
從低位開始每 4 位分成一組,再把每一組換成 0~9、A~F 中的一位數。例如 1011 0110 中,1011 是 B、0110 是 6,所以是 B6。位數不是 4 的倍數時,先在高位補 0 再分組。轉換為八進位時則每 3 位一組。
8 位元共有 256 種組合,其中最高位元為 1 的 128 種分配給負數(−128~−1),最高位元為 0 的 128 種分配給 0 與正數(0~127)。由於 0 佔用了非負數那一側的一個位置,因此無法表示 +128。一般而言,n 位元可表示 −2ⁿ⁻¹ 到 2ⁿ⁻¹ − 1。
一補數只是把所有位元反轉,會出現 +0(0000 0000)與 −0(1111 1111)兩個零,加法時還需要把最高位的進位加回最低位(循環進位)。二補數是反轉後再加 1,零只有一個,並能與無號數共用同一個加法器。因此,目前一般的電腦都以二補數表示整數。
在 8 位元下,以無號解讀為 255,以二補數有號解讀為 −1。同樣的 FF 若以 16 位元輸入,會成為 00FF,即使以有號解讀也是 255。值是多少,取決於位元寬度以及是否以有號方式解讀。