2.1 信息储存
2.1.1十六进制表示法
这一节主要讲的是二进制、十进制和十六进制之间的相互转换
①十六进制——>二进制
例:Ox173A4C
1 | 7 | 3 | A | 4 | C |
---|---|---|---|---|---|
0001 | 0111 | 0011 | 1010 | 0100 | 1100 |
二进制表示:000101110011101001001100
(16=2的4次方,十六进制一位的值与二进制四位的值相对应,自己的理解)
②二进制——>十六进制
例1:1111001010110110110011
11,1100,1010,1101,1011,0011
(从右到左以4个位一份,最后一个补零)
0011 | 1100 | 1010 | 1101 | 1011 | 0011 |
---|---|---|---|---|---|
3 | C | A | D | B | 3 |
十六进制表示:Ox3CADB3
例2:2的11次方
2的11次方
=2的3次方X2的8次方
=8X16的2次方
=Ox800
十六进制表示:Ox800
③十进制——>十六进制
例:314156
314156/16=19634余 12
19634/16=1227余 2
1227/16=76余 11
76/16=4余 12
4/16=0余4
十六进制表示:Ox4CB2C
④十六进制——>十进制
例:Ox7AF
7X16的2次方+10X16+15=1967
十进制表示:1967
书中句子:
二进制表示法太过冗长,而十进制表示法与位模式的相互转化很麻烦。替代方法是,以16为基数,或者叫十六进制数,来表示位模式。
2.1.2字数据大小
1、字长:指针数据的标称大小。
对于一个字长为w位的机器而言,虚拟地址的范围为 0~2的w次方-1 ,程序最多访问2的w次方个字节。
2、“32位程序”与“64位程序”的区别在于该程序是如何编译的,而不是其运行的机器类型。(32位程序可以在32位和64位的机器上运行,而64位的程序只能在64位机器上运行。)
基本数据类型占用的字节长度受程序是如何编译的影响而变化,下图给出的是32位和64位程序的典型值
IOS C99引入了一类数据类型,其数据大小是固定的,不随编译器和机器的设置而变化。(int32_t和int64_t所占用字节分别为4和8)
32位的程序在转移到64位的机器上时会显现出许多隐藏的对字长的依赖性问题
例如:在32位程序里一个声明为int类型的程序对象,被用来储存一个指针。在32位机器的时候是可以的,一移植到64位机器就会有问题。对比字节数发现64位int只有4个字节,而char有8个。
2.1.3 寻址和字节顺序
1.多字节对象的储存:几乎在所有的计算机上,多字节对象都被存储为连续的字节序列,对象的地址为所用字节中最小地址。
2.字节顺序(小端法,大端法)
小端法——最低有效字节在最前面的方式。
大端法——最高有效字节在最前面的方式。
例:int类型x=Ox01234567存储在地址为Ox100处,则
地址 | Ox100 | Ox101 | Ox102 | Ox103 |
---|---|---|---|---|
小端法 | 67 | 45 | 23 | 01 |
大端法 | 01 | 23 | 45 | 67 |
(一个字节8位,2的8次方=16的2次方,所以每个地址可以存放十六进制的两个数)
一旦选择了特定的操作系统,,那么字节顺序也就固定了下来。
3.需要注意字节顺序的三种情况。
(1)小端法机器与大端法机器产生的数据在互相传送时,字里的字节会发生反序的问题。
解决:网络应用程序的代码编写必须遵循已建立的关于字节顺序的规则,以确保发送方机器将其内部表示转换成网络标准,而接收方机器则将网络标准转化为它的内部表示。
(2)阅读表示整数数据的字节序列时字节顺序也很重要。
文中示例:
针对Intel x86-64处理器的机器级代码表示:
4004d3:01 05 43 0b 20 00 add %eax,Ox200b43(%rip)
解释:01 05 43 0b 20 00是一条指令的字节级表示,这条指令是把一个字长的数据加到一个值上,该值的存储地址Ox200b43加上当前程序计算器的值得到,当前程序计数器的值即为下一条将要执行指令的地址