計算機組成原理——數據的表示與運用

數值與編碼

進位記數制及其相互轉換
十進制、二進制、八進制、十六進制
真值、機器數(原碼、反碼、補碼)
字符與字符串的編碼(小端和大端方式存儲 )
數據校驗
奇偶校驗、CRC冗餘校驗、海明校驗c++

定點數的表示和運算

無符號數的表示,有符號數的表示
定點數的運算
移位、原碼加/減、補碼加/減、乘/除、溢出判別編碼

浮點數的表示和運算

浮點:表示範圍、IEEE754標準、浮點數加/減運算
ALU結構
串行加法器和並行加法器、ALU的功能和結構

spa

20093d

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
 
code

答案:D
考點:整數的補碼錶示和補碼加法。x和z是int型,佔四個字節,y是short型佔兩個字節。blog

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.發生溢出
class

答案: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×232
階碼=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、z一、z二、k1和k2。(提示:帶符號整數用補碼錶示)
(1)執行上述程序段後,寄存器R一、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 單精度浮點數格式

對於一個非0且不是無窮大的浮點數,其階碼實際值爲-126~+127,對應移碼1~254。
尾數的最大值爲:0.1111.....111111共23位小數
取階碼127,即指數127。
那麼,根據 X = (-1) s ×(1.M)×2  E-127   ,有
最大值爲 (1.11111.....1)2 ×2127 =(1+1-2-23) ×2 127 = (2-2 -23) ×2 127 =2128-2104

問題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. 0x十一、0xC00D
B. 0x00、0xC00E       D. 0x十一、0xC00E

答案:D

273=256+16+1=100010001B=0000  0111H
小端:高地址存高半字/字節;低地址存低半字/字節

什麼是數據按邊界對齊存儲?
簡單的說,對於int型而言,起始地址爲4的倍數;對於char類型而言,起始地址爲任意字節皆可;對於short類型而言,起始地址爲2的倍數;對於結構體而言,起始地址結構體內類型最大的字節量的整數倍;
0xC008  中內容:0x11,record.c的地址:0xC00E

 

2013

1三、某數採用 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
1三、由 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分)

答:不可能須要右規,可能須要左規,由於規格化的尾數是純小數,兩個純小數相乘不會獲得整數,但會變得更小,而且左規最多隻需一次。

相關文章
相關標籤/搜索