資訊的表示與處理練習題 (Practice - Information Representation)


Question 1 - 2 的冪轉十六進位 [recall]

不經過完整二進位展開,請直接寫出 211219 的十六進位表示,並說明所用的規則。


Question 2 - Little Endian 位元組排列 [recall]

在 little-endian 機器上宣告 int x = 0x01234567;,且 &x = 0x100
請寫出位址 0x1000x103 各儲存的 byte 值。


Question 3 - 邏輯運算 vs 位元運算 [recall]

請分別求出 !0x41~0x410x69 && 0x550x69 & 0x55 的值(以 1 byte 表示),並說明兩類運算子的本質差異。


Question 4 - 兩種右移 [recall]

8-bit 值 x = [10010101]。請寫出 x >> 4 在 logical shift 與 arithmetic shift 下的結果,並說明 C 標準對 signed 與 unsigned 資料的右移各如何規定。


Question 5 - 三大常數 [recall]

對 w-bit 的 two's-complement 與 unsigned 表示,請寫出 UMax、TMin、TMax 的公式與彼此的關係式,並說明範圍為何不對稱。


Question 6 - 位元擴展規則 [recall]

short sx = -12345;(bit pattern 0xCFC7)與 unsigned short usx = 53191;(同為 0xCFC7)。
兩者分別轉成 intunsigned 後,32-bit 的 bit pattern 各是什麼?各用哪種擴展?


Question 7 - Signed/Unsigned 混合比較 [recall]

在 32-bit 環境下,-1 < 0U2147483647U > -2147483647-1 的結果各是什麼?為什麼?


Question 8 - Signed 加法溢位偵測 [recall]

s = x + y(w-bit two's-complement)。請寫出偵測 positive overflow 與 negative overflow 的條件,並說明一正一負相加為何絕不溢位。


Question 9 - IEEE 754 分類與 Bias [recall]

依 exp 欄位(k bits)與 frac 欄位的內容,IEEE 754 的 bit pattern 分成哪幾類?各類的 E 與 M 如何計算?Bias 的公式是什麼?


Question 10 - TMin 的取負 [recall]

對 two's-complement 值 x,-x 的位元算法是什麼?-TMin 等於多少?為什麼?


Question 11 - 同一 Bit Pattern 的兩種解讀 [application]

8-bit 的 bit pattern 為 0xA7。請分別計算其 unsigned 解讀 B2U8 與 two's-complement 解讀 B2T8 的十進位值,並驗證兩者的關係。


Question 12 - 4-bit 加法溢位計算 [application]

以 4-bit two's-complement 計算 5 + 5-8 + (-5) 的結果(截斷為 4 bits 後的值),並指出各屬於哪種溢位情況。


Question 13 - 乘以常數的移位改寫 [application]

編譯器要把 x * 14 改寫成 shift 與 add/sub 的組合。

int mul14(int x) {
    return x * 14;
}

請分別寫出 Form A 與 Form B 的展開式,並指出哪個較划算。


Question 14 - 8-bit 浮點解碼 [application]

某 8-bit 浮點格式:1 sign bit、k = 4 exp bits、n = 3 frac bits(Bias = 7)。
請解碼 bit pattern 0 0101 110:寫出 E、M 與十進位值 V。


Question 15 - 用減法驗證加法溢位? [analysis]

有人提出以下函式偵測 signed 加法溢位:

int tadd_ok(int x, int y) {
    int sum = x + y;
    return (sum - x == y) && (sum - y == x);
}

請分析此函式對哪些輸入回傳錯誤結果,並解釋根本原因。乘法溢位能否用類似手法(除法)驗證?


Question 16 - Unsigned 迴圈邊界 Bug [analysis]

以下函式在 length = 0 時會發生嚴重錯誤:

float sum_elements(float a[], unsigned length) {
    float result = 0;
    for (int i = 0; i <= length - 1; i++)
        result += a[i];
    return result;
}

請分析錯誤發生的機制,說明為何編譯器不會警告,並給出修正方式。