二的補數來表現負數

這是一個二進位的小問題. 在電腦的世界裡, 使用二進位表示法來存放數字是再單純不過的. 不過數字為能有更佳的效率, 有一些設計是很重要的, 例如用二的補數來表示負數, 以下為一個例子.

假設用一個 byte 來代表數字的話, 則共有8個bit可用, 最高字元保留給符號, 而數字就用二進位法來放, 所以8個bit表示如下:

7-6-5-4-3-2-1-0

其中第0個bit最右側, 也就是最低位元, 最左邊是第7個bit, 也就是最高位元.

接下來要說明數字囉

00000001 (b)=1(d)

00000010(b)=2(d)

00000100(b)=4(d)

00010101(b)=21(d)

…. 以此類推, 而最大正數可以用這個表示, 除了第7個bit不動, 其餘都是1的話:

01111111(b)=127(d)

好, 接下來看負數怎麼表示. 先來看所謂二的補數, 二的補數(two’s complement)就是將位元反置後再加一, 來看一個例子:

25(d)=00011001(b)

而要代表-25的二進位數, 則用 00011001(b)反置後再加一

1. 反置 11100110

2. 再加1 得 11100111,

3. 所以得 11100111(b)=-25(d)

再舉一個例子, 2(d)=00000010(b),

1. 反置 11111101,

2. 再加1得 11111110,

3. 所以得11111110(b)=-2(d)

接下來看如何反過來做, 若今天有個值是 110001010(b) 怎麼算回來呢?

1. 先減1, 110001001

2. 再反置得 001110110

3. 所以得 001110110(b)=118(d)

4. 所以 110001010(b)=-118(d)

這樣就行囉!

所以 8個bit的範圍最小到最大就是 -128~127共256個數字.

參考資料:

http://blog.udn.com/Piner/3033066

http://squall.cs.ntou.edu.tw/cprog/Materials/TwosComplementFormat.html