#include#include#includetypedef unsigned char * byte_pointer;
void show_bytes(byte_pointer start, size_t len)
void show_int(int x)
void show_float(float x)
void show_pointer(void *x)
void show_short(short x)
void show_long(long x)
void show_double(double x)
void test_show_bytes(int val)
int main(void)
int is_little_endian()
return ((x & 0xff) | (y & ~0xff));
unsigned replace_byte(unsigned x, int i, unsigned char b)
#include/* 包含測試部分 */
// a:
int is_int_max(int x)
// b:
int is_zero(int x)
// c:
int is_low_byte(int x)
// d:
int is_high_byte(int x)
int main(void) // 測試
int int_shifts_are_arithmetic()
#include/*帶測試部分*/
unsigned srl(unsigned x, int k)
int sra(int x, int k)
int main(void)
int any_odd_one(unsigned x)
int odd_ones(unsigned x)
int leftmost_one(unsigned x)
/*原題***/
int bad_int_size_is_32()
// a: 左移超過了可移動的最大值
// b: int beyond_msb = 2 << 31;
// c: /*修改後的***/
int bad_int_size_is_32()
int lower_one_mask(int n)
unsigned rotate_left(unsigned x, int n)
int fits_bits(int x, int n)
a: return (word >> (bytenum << 3)) & 0xff; 返回的是乙個unsigned型別,而要求返回的是int型別。
b: typedef unsigned packed_t;
int xbyte(packed_t word, int bytenum);
int xbyte(packed_t word, int bytenum)
a: maxbytes - sizeof(val) 是乙個unsigned型別
b: size_t maxbytes
#include#includeint negative_over(int x, int y)
int positive_over(int x, int y)
int saturating_add(int x, int y)
int main(void) /*測試*/
#include#includeint neg_over(int x, int y)
int pos_over(int x, int y)
int tusb_ok(int x, int y)
int main(void) /*測試*/
unsigned unsigned_high_prod(unsigned x, unsigned y)
a: x << 4 + x
b: x - x << 3
c: x << 6 - x << 2
d: x << 4 - x << 7
int divide_power(int x, int k)
由於3*x會溢位,所以要先除4再乘3,但是問題就出現了,請看下表:
x/4後理論值
/4後實際值
*3後理論值
*3後實際值82
2669
2.25
26.75(6)610
2.52
7.5(7)611
2.75
28.25(8)612
3399
在除4的過程中,有些時候捨去了關鍵的小數部分,導致實際情況與理論情況不符
int mul3div4(int x)
int threefourths(int x)
a: ~0 << k
b: (~0 << k) ^ (~0 << (j + k))
a: false 令x = tmin
b: true 補碼的加減乘與順序無關
c: true ~x + 1 = -x, ~y + 1 = -y, 所以~x + ~y + 1 = -x -y - 1,
~(x + y) + 1 = -(x + y), ~(x + y) = -(x + y) - 1
d: false 令x = tmin, y = tmax
e: true 測試是檢驗真理的唯一標準
a: x << k - x = y , 故x * 2^k - x = y, 所以x = y / (2^k - 1)
b: (a) 5 / 7
(b) 2 / 5
(c) 19 / 63
return ((ux << 1) == (uy << 1)) || //都為0 +0 -0
(!sx && sy) || //x 為負, y 為正
(sx && sy && (ux <= uy)) || //都為正
(!sx && !sy && (ux >= uy)); //都為負
a:
7.0 = 111.0(二進位制), e = 2, f = 0.110, m = 1.110;
bias = 2 ^(k - 1) - 1, e = e + bias = 2 ^(k - 1) + 1;
位表示: 10...01~110...00
b:e_max = 11...110 = 2 ^k - 2, e_max = e_max - bias = 2 ^(k - 1) - 1;
要滿足題意,則需要e = n, f = 0.111...; m = 1.111....;
e = e + bias = n + 2 ^ (k - 1) - 1; v = 2 ^ (n + 1) - 1;
位表示: e~11...11
c:最小的正規格化數: e = 1, e = 2 - 2 ^ (k - 1), f = 0.0, m = 1.0;
v = 2 ^ e;
它的倒數為: v' = 2 ^ (-e), e' = -e = 2 ^ (k - 1) - 2; m' = m, f' = f;
e' = e' + bias = 2 ^ k - 3;
位表示: 11...101~00.000
略,寫書上了
a:false
b: false
c: true
d: false
e: false
float fpwr2(int x)
else if (x < -126)
else if (x < 128)
else
u = exp << 23 | frac;
return u2f(u);
}
a: 11.0010010000111111011011
b: 11.001001001...
c:小數點後第9位
《深入理解計算機系統(第三版)》第一章
1 計算機提供不同層次的抽象表示,來隱藏實際實現的複雜性 2 程式設計師必須知道編譯系統是如何工作的原因 3 執行hello程式 4 併發是乙個通用的概念,指乙個同時具有多個活動的系統 並行指的是用併發使乙個系統執行的更快 5 意識到快取記憶體的存在,可以利用快取記憶體將程式的效能提高乙個數量級。執...
速讀《深入理解計算機系統(第三版)》問題及解決
p13 使用者棧和執行時堆有什麼區別?資料結構中經常說堆疊,這裡的堆和棧一樣嗎?和作業系統的堆 棧有什麼區別?參考 堆和棧的區別 記憶體和資料結構 作業系統 p31 c格式化指令 2x 表明整數必須用至少兩個數字的十六進製制格式輸出。之前學過 7.2f 點後的2指的是小數點後兩位,那麼 2x 中的點...
深入理解計算機系統 第三版 第三章家庭作業答案
這章有的地方看第一遍的時候看的雲裡霧裡,看第二遍的時候才看明白。印象較深的是被呼叫者儲存暫存器,這部分內容看的得有3遍,沒看懂之前一直很迷,看懂之後只有兩個感覺 一是妙,二是簡單。這章內容,讓我知道了c語言的 是如何在機器上執行的,在此過程中,我突然很好奇編譯器如何把c原始碼翻譯為組合語言,以及如何...