目的: 檢驗學員對數值系統和浮點表示法的認知
1
考慮以下程式,作用是將給定的無號數值轉增倍並轉化為浮點數形式:
/* Return bit-level equivalent of expression 2 * uf
* for floating point uf
*/
unsigned float_twice(unsigned uf) {
unsigned uf_sgn = (uf >> A1) & 0x01;
unsigned uf_exp = (uf >> A2) & 0xff;
if (uf_exp == 0) {
uf <<= 1;
uf += (uf_sgn << A3);
}
else if (uf_exp != 0xff) {
uf_exp += A4;
uf &= 0x807fffff;
uf = uf + (uf_exp << A5);
}
return uf + A6;
}
假設 unsigned int 寬度為 32-bit,考慮三種狀況:
NaN
,返回 NaN
補完程式碼。
作答區
A1 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
1A2 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
1A3 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
1A4 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
1A5 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
1A6 = ?
(a)
32(b)
31(c)
30(d)
29(e)
28(f)
27(g)
26(h)
25(i)
24(j)
23(k)
0(l)
12
考慮以下程式,給定一個浮點數參數,將其絕對值寫回。
void absf(double *x) {
*(((int *) &x) + S1) S2= 0x7fffffff;
}
假設 unsigned int 寬度為 32-bit,並在且 little-endian 環境。其中 S1 是個數值,S2 是個運算子,請補完。
作答區
S1 = ?
(a)
0(b)
1(c)
2(d)
3(e)
31S2 = ?
(a)
*(b)
/(c)
+(d)
-(e)
|(f)
&(g)
^(h)
~延伸問題:
–