數值與編碼
進位記數制及其相互轉換
十進制、二進制、八進制、十六進制
真值、機器數(原碼、反碼、補碼)
字符與字符串的編碼(小端和大端方式存儲 )
數據校驗
奇偶校驗、CRC冗余校驗、海明校驗
定點數的表示和運算
無符號數的表示,有符號數的表示
定點數的運算
移位、原碼加/減、補碼加/減、乘/除、溢出判別
浮點數的表示和運算
浮點:表示范圍、IEEE754標准、浮點數加/減運算
ALU結構
串行加法器和並行加法器、ALU的功能和結構
2009
12.一個 C 語言程序在一台 32 位機器上運行。程序中定義了三個變量 xyz,其中 x 和 z 是 int型,y 為 short 型。當 x=127,y= -9 時,執行賦值語句 z=x+y 后,xyz 的值分別是
A.X=0000007FH,y=FFF9H,z=00000076H
B.X=0000007FH,y=FFF9H,z=FFFF0076H
C.X=0000007FH,y=FFF7H,z=FFFF0076H
D.X=0000007FH,y=FFF7H,z=00000076H
答案:D
考點:整數的補碼表示和補碼加法。x和z是int型,占四個字節,y是short型占兩個字節。
y=-9的二進制原碼為1000 0000 0000 1001
補碼=原碼取反+1 為1111 1111 1111 0111 = (FFF7)16
而在進行x+y時,int型能夠表示所有的short類型,所以現將short轉為int再相加為118
13.浮點數加減運算過程一般包括對階、尾數運算、規格化、舍入和判溢出等步驟。設浮點數的階碼和尾數均采用補碼表示,且位數分別為 5 位和 7 位(均含 2 位符號位)。若有兩個數 X=27×29/32,Y=25×5/8,則用浮點加法計算 X+Y 的最終結果是
A.00111 1100010 B.00111 0100010
C.01000 0010001 D.發生溢出
答案:D
考點:浮點數加法運算
雙符號位法溢出判斷
根據題意,X可記為00,111;00,11101(分號前為階碼,分號后為尾數),
Y可記為00,101;00,10100(20/32)
(1)對階,X、Y階碼相減,即00,111-00,101=00,111+11,0111=00,010,可知X的階碼比Y的價碼大2,根據小階向大階看齊的原則,將Y的階碼加2,尾數右移2位,可得Y為00,111;00,00101;
(2)尾數相加,即00,11101+00,00101=01,00010,尾數相加結果符號位為01,故需進行右規;
(3)規格化,將尾數右移1位,階碼加1,得X+Y為01,000;00,10001,階碼符號位為01,說明發生溢出,故選D。
2010
13.假定有4個整數用8位補碼分別表示r1=FEH,r2=F2H,r3=90H,r4=F8H,若將運算結果存放在一個8位寄存器中,則下列運算會發生溢出的是()
A. r1 x r2
B. r2 x r3
C. r1 x r4
D. r2 x r4
答案:B
用補碼表示時8位寄存器所能表示的整數范圍為-128到+127。
r1=(15×16+14)-256=-2;
r2=(15×16+2)-256=-14;
r3=(9×16+0)-256=-112;
r4=(15×16+8)-256=-8;
則r1×r2=28,r2×r3=1568,r1×r4=16,r2×r4=112,只有r2×r3結果溢出。
14.假定變量i,f,d數據類型分別為int, float, double(int用補碼表示,float和double用IEEE754單精度和雙精度浮點數據格式表示),已知i=785,f=1.5678e3,d=1.5e100,若在32位機器中執行下列關系表達式,則結果為真的是()
(I) i==(int)(float)I
(II)f==(float)(int)f
(III)f==(float)(double)f
(IV)(d+f)-d==f
A. 僅I和II B. 僅I和III
C. 僅II和III D. 僅III和I
答案:B
考查不同精度的數在計算機中的表示方法及其相互裝換。
在c++中為了盡量保證精度不丟失,一般會把低轉化為高精度,比如char->int->float->double
由於(int)f=1,小數點后面4位丟失,故Ⅱ錯。Ⅳ的計算過程是先將f轉化為雙精度浮點數據格式,然后進行加法運算,故(d+f)-d得到的結果為雙精度浮點數據格式,而f為單精度浮點數據格式,故Ⅳ錯。
(Ⅰ)i=(int)(float)i//i變成浮點數,不變;
(Ⅱ)f=(floal)(int)f//f變成整數時,精度變小;
(Ⅲ)f=(float)(double)f//f轉為雙精度,大小不變;
(Ⅳ)(d+f)-d=f//雙精度值==單精度值,結果出錯。
2011
13.float型數據通常用IEEE 754單精度浮點數格式表示。若編譯器將float型變量x分配在一個32位浮點寄存器FR1中,且x = -8.25,則FR1的內容是
A.C104 0000H B.C242 0000H
C.C184 0000H D.C1C2 0000H
答案:A
x=-8.25=(-1000.01)2﹦(-1.000 01×23)2
階碼=E=e+127=130=(1000 0010)2,
單精度浮點數格式: 1位數符,8位階碼(含階符),23位尾數(格式化原碼尾數的最高位恆為1,所以不在尾數中表示出來,計算時在尾數前面自動添加1)
故FR1內容為:
1 1000 0010 000 0100 0000 0000 0000 0000
即1100 0001 0000 0100 0000 0000 0000 0000,
即C1040000H
43(11分)假定在一個8位字長的計算機中運行如下類C程序段:
unsigned int x = 134; unsigned int y = 246; int m = x; int n = y; unsigned int z1 = x–y; unsigned int z2 = x+y; int k1 = m–n; int k2 = m+n;
若編譯器編譯時將8個8位寄存器R1 ~ R8分別分配給變量x、y、m、n、z1、z2、k1和k2。(提示:帶符號整數用補碼表示)
(1)執行上述程序段后,寄存器R1、R5和R6的內容分別是什么?(用十六進制表示)
R1存儲的是134,轉換成二進制為1000 0110B,即86H。
R5存儲的是x-y的內容,x-y=-112,轉換成二進制為1001 0000B(補碼),即90H。
//x和y都是無符號整型,兩數相減的過程是按照正常的相減方式的,如果看成有符號的整型,那么就是-20,存儲的信息也和有符號整型存儲的信息完全一致,但是這兩者表示數據的方法不一樣,這就導致了相同的信息表示出不同的數據,這里的112是有符號整型的說法罷了。
R6存儲的是x+y的內容,x+y=380,轉換成二進制為1 0111 1100B(前面的進位舍棄),即7CH。由於計算機字長為8位,所以無符號整數能表示的范圍為0~255。而x+y=380,故溢出。
(2)執行上述程序段后,變量m和k1的值分別是多少?(用十進制表示)
m二進制表示為1000 0110B,由於m是int型,所以最高位為符號位,所以可以得出m的原碼為:1111 1010(對10000110除符號位取反加1)(負數的原碼與補碼之間的轉換都是除符號位取反加一),即-122。
同理n的二進制表示為1111 0110B,故n的原碼為:1000 1010,轉成十進制為-10。
所以k1=-122-(-10)=-112.
(3)上述程序段涉及帶符號整數加/減、無符號整數加/減運算,這四種運算能否利用同一個加法器及輔助電路實現?簡述理由。
可以利用同一個加法器及輔助電路實現。因為無符號整數都是以補碼形式存儲,所以運算規則都是一樣的。
但是有一點需要考慮,由於無符號整數和有符號整數的表示范圍是不一樣的,所以需要設置不一樣的溢出電路。
(4)計算機內部如何判斷帶符號整數加/減運算的結果是否發生溢出?上述程序段中,哪些帶符號整數運算語句的執行結果會發生溢出?
三種方法可以判斷溢出:
雙符號位、最高位進位、符號相同操作數的運算后與原操作數的符號不同則溢出。
帶符號整數只有k2會發生溢出。
分析:8位帶符號整數的補碼取值范圍為:
-128~+127,而k2=m+n=-122-10=-132,超出范圍,而k1=-112,在范圍-128~+127之內。
2012
13.假定編譯器規定 int 和 short 類型長度占 32 位和 16 位,執行下列 C 語言語句
unsigned short x = 65530;
unsigned int y = x;
得到 y 的機器數為
A. 0000 7FFA B. 0000 FFFA
C. FFFF 7FFA D. FFFF FFFA
答案:B
考查:無符號數,零擴展
x=65530,將其化為二進制 1111 1111 1111 1010,對應的16進制為FFFA,將其轉化為32位的int為0000 FFFAH
14.float 類型(即 IEEE754 單精度浮點數格式)能表示的最大正整數是
A. 2126-2103
B. 2127-2104
C. 2127-2103
D.2128-2104
答案:D
考查: IEEE754 單精度浮點數格式
問題1:表示的為什么是正整數而不是小數?其實23位尾數是用來表示小數部分的,但是用階碼可以表示的指數是127,如果都用上是遠大於小數部分的23位的。
問題2: 0.1111.....111111共23個1是怎么表示成1-2-23的呢?其實可以這樣想如果給這個數加上一個0.000......000001那么就會變為1,而這個0.000......000001
就是2-23 !
15.某計算機存儲器按字節編址,采用小端方式存放數據。假定編譯器規定 int 和 short 型長度分別為 32 位和 16 位,並且數據按邊界對齊存儲。某 C 語言程序段如下:
struct{ int a; char b; short c; } record; record.a=273;
若 record 變量的首地址為 0Xc008,則地址0Xc008 中內容及 record.c 的地址分別為
A. 0x00、0xC00D C. 0x11、0xC00D
B. 0x00、0xC00E D. 0x11、0xC00E
答案:D
273=256+16+1=100010001B=0000 0111H
小端:高地址存高半字/字節;低地址存低半字/字節
什么是數據按邊界對齊存儲?
簡單的說,對於int型而言,起始地址為4的倍數;對於char類型而言,起始地址為任意字節皆可;對於short類型而言,起始地址為2的倍數;對於結構體而言,起始地址結構體內類型最大的字節量的整數倍;
0xC008 中內容:0x11,record.c的地址:0xC00E
2013
13、某數采用 IEEE 754 單精度浮點數格式表示為 C640 0000H,則該數的值是()
A. -1.5*213 B. -1.5*212
C. -0.5*213 D. -0.5*212
答案: A
二進制為:1 100 0110 0 100 0000 0000 0000 0000 0000
符號位 1 負數
階碼 140-127=13
尾數 1.5
14.某字長為8位的計算機中,已知整型變量x、y的機器數分別為[x]補=11110100,[y]補=10110000。若整型變量 z=2*x+y/2,則 z 的機器數為
A. 1 1000000 B. 0 0100100
C. 1 0101010 D. 溢出
答案:A
解析:將 x 左移一位,得到 11101000
將 y 右移一位,得到 11011000
兩數相加判斷是否溢出可以使用雙符號位法來判斷,符號位和最高位進位都是1,不會造成溢出。
兩個數的補碼相加的機器數為 11000000
15.用海明碼對長度為 8 位的數據進行檢/糾錯時,若能糾正一位錯。則校驗位數至少為
A. 2 B. 3 C. 4 D. 5
答案:C
考查:設校驗位的位數為k,數據位的位數為n,應滿足下述關系:2k≥n+k+1。n=8,當k=4時,24(=16)>8+4+1(=13),符合要求,校驗位至少是4位。
2014
13. 若x=103,y=-25,則下列表達式采用8位定點補碼運算實現時,會發生溢出的是
A x+y B -x+y C x-y D -x-y
答案:C
8位原碼和反碼能夠表示數的范圍是-127~127
8位補碼能夠表示數的范圍是 -128~127
用補碼表示時:
10000000-11111111表示-128到-1, 00000000-01111111表示0-127
補碼的1111 1111轉換成原碼就是1000 0001,也就是-1。
在補碼中用(-128)代替了(-0),所以補碼的表示范圍為: -128~127
注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000),把10000000取反加1就是-128.
14. float型整數用IEEE754單精度浮點格式表示,假設兩個float型變量x和y分別在32為寄存器f1和f2中,若(f1)=CC900000H, (f2)=B0C00000H,則x和y之間的關系為:
A x<y且符號相同 B x<y且符號不同
C x>y且符號相同 D x>y且符號不同
答案:A
解析:將f1 f2 分別展開,分別判斷符號位和階碼
(f1)=CC900000H=1 100 1100 1 001 0000 0000 0000 0000 0000
(f2)=B0C00000H=1 011 0000 1 100 0000 0000 0000 0000 0000
在x,y同為負數的情況下,x的階碼為26,尾數為1.125;y的階碼為-30,尾數為1.5,則y>x
2015
13、由 3 個“1”和 5 個“0”組成的 8 位二進制補碼,能表示的最小整數是()
A.-126 B.-125
C.-32 D.-3
答案B
二進制的補碼表示。
對於這道題,我們應該怎樣考慮?
選擇題的話,可以投機一點,直接將選項轉為補碼就行了。
但要是在問答題中,由於最小的數肯定是負數,首先第一位就是1 ,又因為補碼要取反,所以最小的數應該是 1,0000011.除開符號位取反加1后變成 1,1111101。這個數的十進制是-125
或者有這樣一種說法,補碼小這個數就小,補碼大這個數就大!
補碼:10000011
原碼:11111101=-125
14.下列有關浮點數加減運算的敘述中,正確的()
Ⅰ.對階操作不會引起階碼上溢或下溢
Ⅱ. 右規和尾數舍入都可能引起階碼上溢
Ⅲ.左規時可能引起階碼下溢
Ⅳ. 尾數溢出時結果不一定溢出
A.僅Ⅱ、Ⅲ B.僅Ⅰ、Ⅱ、Ⅳ
C.僅Ⅰ、Ⅲ、Ⅳ D.Ⅰ、Ⅱ、Ⅲ、Ⅳ
答案D
浮點數加減運算
1.對階時,統一保留大的階數,並不會造成階碼的上溢或者下溢。
2.右規和尾數舍入的過程會造成階碼的增加,因而有可能會引起階碼上溢。
3.左規的過程會造成階碼的減少,因而有可能會引起階碼下溢。
4.尾數溢出時,階碼不一定會溢出,結果也不一定能溢出。
補充:兩個浮點規格化數相乘,是否可能需要右規?為什么?是否可能需要左規?為什么?其規格化次數可否確定?(6分)
答:不可能需要右規,可能需要左規,因為規格化的尾數是純小數,兩個純小數相乘不會得到整數,但會變得更小,並且左規最多只需一次。