深入理解計算機系統(第三版)第2章 家庭作業

2021-09-05 09:00:51 字數 4579 閱讀 8269

#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原始碼翻譯為組合語言,以及如何...