第二章:
兩分題:
20135327 郭皓 :3
20135329 李海空:1
2.67 給你一個任務,編寫一個過程int_size_is_32(),當在一個int是32位的機器上運作時,該程式産生1,而其他情況則産生0.不允許使用sizeof運算符。下面是開始時的嘗試:
/*The following code does not run properly on some machies*/
int bad_int_size_is_32(){
int set_msb = 1<<31;
int beyond_msb = 1<<32;
return set_msb &&! beyond_msb;
}
當在SUN SPARC這樣的32位機器上編譯并運作時,這個過程傳回的卻是0.下main的編譯器資訊給了我們一個問題的訓示。
warning:left shift count >= width of type
A:左移位數大于等于int長度,32位機器中最多左移31位,16位機器中最多左移15位。
B:用兩次左移來實作<<32:
int set_msb=1<<31;
int beyond_msb=set_msb<<1;
C:用三次左移來實作<<31與<<32:
int temp=1<<15;
temp<<=15;
int set_msb=temp<<1;
int beyond_msb=temp<<2;
三分題:
20135327 郭皓 :4
20135329 李海空:2
2.69 寫出具有如下原型的函數的代碼
/*
*Do rotating right shitf. Assume 0 <= n < w
*Examples when x = 0x12345678 and w = 32:
* n = 4 -> 0x81234567 ,n = 20 -> 0x45678123
*/
unsigned rotate_right(unsigned x, int n);
答:本題主要是編寫一個循環右移的函數,具體代碼如下所示:
#include <stdio.h>
unsigned rotate_right(unsigned x, int n)
{
unsigned a;
a = x<<(32-n);
printf("%x\n",x>>n|a);
}
int main()
unsigned x;
int n;
printf("請輸入32位十六進制數");
scanf("%x",&x);
printf("請輸入右移位數(小于32大于等于0)");
scanf("%d",&n);
if(n>32||n<=0)
printf("右移位數小于32大于等于0!!!");
return 0;
rotate_right(x,n);
這裡我預設w=32 因為要是32位以内的十六進制數必須更改w的取值否則系統預設為32位十六進制,如需修改隻需将32改為w即可。
下圖為測試結果:

試試其他數:
第六章:
6.30
20135327 郭皓 :2.5
20135329 李海空:1.5
A:
由題意知 b=2 s=2 故 兩個低位是塊偏移,然後是兩位的組索引,剩下的位做标記:
B:
1.對于位址0x409,塊偏移(CO):0x1 組引索(CI):0x2 高速緩存标記(CT):0x40 可見該标記的有效位為0,故不命中。
2.對于位址0x40A,塊偏移(CO):0x2 組引索(CI):0x2 高速緩存标記(CT):0x40 可見該标記的有效位為0,故不命中。
3.對于位址0x833,塊偏移(CO):0x3 組引索(CI):0x0 高速緩存标記(CT):0x83 可見該标記的有效位為1,高速緩存的标記位與位址中的标記位比對,故命中 讀出的值為0xD0。
6.37
A
不命中率是100%,直接映射是每組隻有一個高速緩存行,塊大小為32位元組,表示可以存儲8個int數值。 數組是按照行優先存儲的,計算數組一行的大小為256*4=1024,是以高速緩存隻夠存數組的一行。 是以x[0]和x[1]的每一個元素對應的高速緩存是同一個塊。 是以,每次請求都在加載,驅逐,替換。不命中率為100%。
B
不命中率是1/8 ,隻有加載新行時發生不命中,緩存足夠大,可以存儲整個數組 是以隻有冷不命中,而塊大小為32位元組,表示可以存儲8個int數值 是以每次都會加載x[0][i]~x[0][i+7]共8個數值到緩存組中,這裡就隻有x[0][i]是不命中的 是以不命中率為1/8。
C
不命中率為1/8 ,高速緩存隻有1024位元組,不夠存儲數組,數組的第一行和第二行分别加載到緩存同一組的不同行,不會沖突,是以最後還是相當于隻有冷不命中,相當于每8個資料中隻有一個是不命中的 是以不命中率為1/8 。
D
不能了,塊大小不變,因為冷不命中的機率不可能被減小。
E
能,因為塊的大小增加,冷不命中的頻率就降低。