第二章 信息的表示和处理
三种重要的数字表示
- 无符号(unsigned),基于传统的二进制表示法,表示大于等于零的数字
- 补码(two's complement),表示有符号整数的最常见的方法
- 浮点数(floating point),表示实数的科学计数法的以2为基数的版本
整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然能够编码一个较大的数值范围,但是这种表示只是近似的。
建议
程序员应该具有对计算机运算与整数和实数运算之间的关系有清晰理解。
大量的计算机安全漏洞往往都是从计算机算术运算的细节出发的,我们需要去了解程序的底层工作原理以及计算机是如何产生不良的行为的。
2.1 信息存储
指针存在两个方面:值和类型。值表示某个对象的位置,类型表示对应位置上存储对象的类型。
十六进制表示法
练习题2.1
完成下面的数字转换
A. 将0x39A7F8转换为二进制。
B.将二进制1100 1001 0111 1011转换为十六进制。
C.将0xD5E4C转换为二进制
D.将二进制10 0110 1110 0111 1011 0101转换为十六进制。
解析
A. 0011 1001 1010 0111 1111 1000
B. 0xC97B
C. 1101 0101 1110 0100 1100
D. 2 6 E 7 B 5
练习题2.2
填写下表中的空白项,给出2的不同次幂的二进制和十六进制表示:
n | 2n(十进制) | 2n(十六进制) |
---|---|---|
9 | 512 | 0x200 |
19 | ||
16 384 | ||
0x10000 | ||
17 | ||
32 | ||
0x80 |
解析
n | 2n(十进制) | 2n(十六进制) |
---|---|---|
9 | 512 | 0x200 |
19 | 524 288 | 0x80000 |
14 | 16 384 | 0x4000 |
16 | 65 536 | 0x10000 |
17 | 131 072 | 0x20000 |
5 | 32 | 0x20 |
7 | 128 | 0x80 |
练习题2.3
一个字节可以用两个十六进制数字来表示。填写下表中缺失的项,给出不同字节模式的十进制、二进制和十六进制
十进制 | 二进制 | 十六进制 |
---|---|---|
0 | 0000 0000 | 0x00 |
167 | ||
62 | ||
188 | ||
0011 0111 | ||
1000 1000 | ||
1111 0011 | ||
0x52 | ||
0xAC | ||
0xE7 |
解析
十进制 | 二进制 | 十六进制 |
---|---|---|
0 | 0000 0000 | 0x00 |
167 | 1010 0111 | 0xA7 |
62 | 0011 1110 | 0x3E |
188 | 1011 1100 | 0xBC |
55 | 0011 0111 | 0x37 |
136 | 1000 1000 | 0x88 |
243 | 1111 0011 | 0xF3 |
82 | 0101 0010 | 0x52 |
172 | 1010 1100 | 0xAC |
231 | 1110 0111 | 0xE7 |
练习题2.4
不将数字转换为十进制或者二进制,试着解答下面的算术题,答案要用十六进制表示。
提示:只要将执行十进制加法和减法所使用的方法改成以16为基数。
A. 0x503c+0x8=
B. 0x503c-0x40=
C. 0x503c+64=
D. 0x50ea-0x503c=
解析
A. 0x5044
B. 0x4ffc
C. 0x507c
D. 0xae