一、帶符號二進制數表示
1、什么是字長?
計算機數據線一次能傳送的最大的二進制數的位數。常用的字長:
8位、 16位、 32位
↓ ↓↓
z80ibmpc80386
applepc/xt80486
pc/at
2、無符號二進制數
在字長范圍內,所有二進制位都是數值位。
字長8位: 0~255 00h~ffh
字長16位: 0~655350000h~ffffh
字長32位: 0~4294967295 0000 0000h~ffff ffffh
3、有符號二進制數
在字長范圍內,最高二進制位為符號位,其余位為數值位。
字長8位:數值范圍80h~7fh-128~+127
字長16位: 8000h~7fffh-32768~+32767
字長32位: 8000 0000h~7fff ffffh-2147483648~+2147483647
二、帶符號數的補碼表示
在計算機中,任何一個帶符號數,都是以補碼的形式進行存貯和管理的。
1、帶符號數的原碼表示
最高位為符號位,其余位是數值位。
[+121]原= 0111 1011 0000000001111011
[-121]原= 1111 1001 1000000001111001
[+0]原= 0000 00000000000000000000
[-0]原= 1000 00001000000000000000
2、補碼表示
(1)正數,同原碼
(2)負數,原碼的每一位(符號位除外)取反,再在末位加1
例:字長8位,求-11的補碼
原碼 1000 1011
各位取反 1111 0100
末位加11111 0101
例:字長8位,求-0的補碼
原碼1000 0000
各位取反1111 1111
末位加1 0000 0000
還有一種辦法可以寫出一個負數的補碼:
令,則[x]補碼=, n是字長的位數
例:[-1]補== 1111 1111
[-127]補== 1000 0001
[-64]補==1100 0000
[-5]補=?。?111 1011
[-128]補==1000 0000
3、由補碼求真值(補碼對應的十進制數)
原碼就是數字本身,例如:
(+7)的原碼=0000 0111 最高位為符號位(0表示正數)
(–7)的原碼=1000 0111 最高位為符號位(1表示負數)
反碼就是將原碼按位求反(符號位不變),例如:
(+7)的反碼=0111 1000 符號位不變
(–7)的反碼=1111 1000 符號位不變
從計算機運算的角度來講,“符號位不變,將原碼求反再加一”的算法是很方便的,但對于讀者理解補碼的概念沒有多大幫助。
例如:求(–7)的補碼。
注意:當負數以補碼的形式表示時,求該數的原值仍用“求反再加一”的方法,例如,
如果是正數,就不能用上述方法。正數的補碼就是該數的本身,所以本書中不引入“正數的補碼就是原碼”的概念。
其實補碼是針對負數來說的,計算機中只有加法器(沒有減法器),引入補碼的目的是為了將減法計算變?yōu)榧臃ㄓ嬎恪?
有了只有負數才有補碼的概念后,我們就可將注意力放在負數上。讓我們以時鐘來說明補碼的概念,見表1-1。
表1-1
時間
逆時針時間
0(12)
(–12)(–12)的補碼 = 12 – |–12| =
1
(–11)(–11)的補碼 = 12 – |–11| =
2
(–10)(–10)的補碼 = 12 – |–10| =
3
(–09)?。èC9)的補碼 = 12 – |–09| =
4
(–08)?。èC8)的補碼 = 12 – |–08| =
5
(–07) (–7)的補碼 = 12 – |–07| =
6
(–06)?。èC6)的補碼 = 12 – |–06| =
7
(–05) (–5)的補碼 = 12 – |–05| =
8
(–04)?。èC4)的補碼 = 12 – |–04| =
9
(–03)?。èC3)的補碼 = 12 – |–03| =
10
(–02)?。èC2)的補碼 = 12 – |–02| =
11
(–01) (–1)的補碼 = 12 – |–01| =
結論:時間的表示范圍:(–12 ~ +11)
(–x)的補碼 = ?!〃C |–x|(?!? 狀態(tài)的個數0,1,2,…,11)
例如:求時間 –2 的補碼。
(–2)的補碼 = 12 – |–2| = 10
例如:通過補碼將減法轉為加法。
11–10 = 11 +(–10)的補碼 = 11+2 = 13(13 – 12 = 1)
11–1 = 11 +(–1)的補碼 = 11+11 = 22(22 – 12 = 10)
12–12 = 12 +(–12)的補碼 = 12+0 = 12(12 – 12 = 0)
將補碼用于1個字節(jié):
模==128(?!? 狀態(tài)的個數 0~127)(127=7fh)
(–1)的補碼 = 128 – |–1|=128–1=127(7fh),再加上符號位,即為0ffh
(–2)的補碼 = 128 – |–2|=128–2=126(7eh),再加上符號位,即為0feh
(
(–127)的補碼 = 128 – |–127|=128–127=1(01h),再加上符號位,即為81h
(–128)的補碼 = 128 – |–128|=128–128=0(00h),再加上符號位,即為80h
1 個字節(jié)可表示的數:(–128 ~ 127)
將補碼用于1個字:
模==32768(模=狀態(tài)的個數0~32767)?。?2767=7fffh)
(–1)補=32768–|–1|=32768–1=32767(7fffh),再加上符號位,即為0ffffh
(–2)補=32768–|–2|=32768–2=32766(7ffeh),再加上符號位,即為0fffeh
(
(–32767)補=32768–|–32767|=1(0001h),再加上符號位,即為8001h
(–32768)補=32768–|–32768|=0(0000h),再加上符號位,即為8000h
1個字可表示的數:(–32768 ~ 32767)
4、補碼的應用
1、補碼的運算規(guī)則
[x+y]= [x] +[y]
[x-y]= [x] +[-y]
2、引進補碼后,減法可以變成加法
例1:8-2=[8]+[-2] =+6
0000 1000
+ 1111 1110→-2補碼
丟失 ← 1 0000 0110
例2:64-(-10)=[64]+[10]?。?4
0100 0000
+ 0000 1010
0100 1010
例3:64-10=[64]+[-10]=54
0100 0000
+ 1111 0110
1 0011 0110