练习题2.1 完成下面的数字转换:
A. 将0x39A7F8转换位二进制
B. 将二进制1100100101111011转换为十六进制
C. 将0xD5E4C转换二进制
D. 将二进制1001101110011110110101转换为十六进制
解: A. 0011-1001-1010-0111-1111-1000 B. 0xC97B
C. 1101-0101-1110-0100-1100 D. 0x26E7B5
练习题2.2 填写下表中的空白项,给出2的不同次幂的二进制和十六进制表示:
解
练习题2.3 一个字节可以用两个十六进制数来表示。填写下表中缺失的项,给出不同字节模式的十进制,二进制和十六进制值:
解:
练习题2.4 不将数字转换为十进制或者二进制,试着解答下面的算术题,答案要用十六进制表示。
A. 0x503C + 0x8 = ______________
B. 0x503C - 0x40 = ______________
C. 0x503C + 64 = ______________
D. 0x50EA - 0x503C = ____________
解:
A. 0x5044 B. 0x4F9C C. 0x507C D. 0xAF
练习题2.5 思考下面对show_bytes的三次调用:
int val = 0x87654321;
byte_pointer valp = (byte_pointer) &val;
show_bytes(valp, 1); // A.
show_bytes(valp, 2); // B.
show_bytes(valp, 3); // C.
指出在小端法机器和大端法机器上,每次调用的输出值。
A. 小端法:________ 大端法:________
B. 小端法:________ 大端法:________
C. 小端法:________ 大端法:________
解:A. 小端法:21 大端法:87
B. 小端法:21 43 大端法:87 65
C. 小端法:21 43 65 大端法:87 65 43
这是基于qemu模拟器的实现
练习题2.6 使用show_int和show_float,我们确定整数3510593的十六进制表示为0x00359141,而浮点数3510593.0的十六进制表示为0x4A564504。
A. 写出这两个十六进制值的二进制表示。
B. 移动这两个二进制串的相对位置,使得它们匹配的位数最多。有多少位相匹配呢?
C. 串中的什么部分不相匹配?
解:
A. 0x00359141 0000 0000 0011 0101 1001 0001 0100 0001
0x4A56504 0100 1010 0101 0110 0100 0101 0000 0100
B. 0000 0000 0011 0101 1001 0001 0100 0001
0100 1010 0 1 0101 1001 0001 0100 0001 00
共有21位相匹配
C. 我们发现除了最高有效位1,整数的所有位都嵌在浮点数中。这正好也是书中示例的情况。另外,浮点数有一些非零的高位不与整数中的高位相匹配
练习题2.7 下面对show_bytes的调用将输出什么结果?
const char *s = "abcdef";
show_bytes((byte_pointer) s, strlens(s));
注意字母 ‘a' ~ 'z' 的ASCII码为0x61~0x7A
解:输出 61 62 63 64 65 66(库函数strlen不计算终止的空白符,所以show_bytes只打印到字符 ’f' )