最近补基础知识,把一些内容通过博客记录下来,以便今后参考 ——幸亏6年前写了博客,现在回忆真需要参考:)
我们知道,计算机系统设计的一个目的,就是将存储空间划分为方便管理的单元。关于为什么用二进制和十六进制来处理数据也不用我多废话了,看下例子:
比如10进制23=2*10^1+3*10^0,那么16进制0x23=2*16^1+3*16^0=35
如果是2进制,100011=1*2^5+1*2^1+1*2^0=35=0x23
我们发现10对应2,而0011对应3,所以0x23很容易通过8421码写出其2进制形式。
关于大端小端:
这里就遇到个问题,假设有个int a;a有四个字节空间,假设其物理地址分别是
0x00,
0x01,
0x02,
0x03
现在要存储0x12345678这个数,很明显,这个数确实需要四个字节的空间才能存下,那么到底是从上往下存,还是从下往上存呢?这里就涉及到大端(big endian)和小端(little endian)概念。
如果按大端存法,从起始地址0x00开始存最高位字节12,然后地址按权位降低而往下递增;如果按小端存法,则刚好相反:低地址存低权位,高地址存高权位。
小端存法 |
地址标识 |
大端存法 |
78 |
0x00 |
12 |
56 |
0x01 |
34 |
34 |
0x02 |
56 |
12 |
0x03 |
78 |
尽管从直觉上我们觉得貌似右边的存法更符合习惯,然而一般我们接触的系统环境,都是采取小端存法。
按理说,如果为了更好的管理存储空间,那么某段存储空间所存储的类型应该是确定,这样在系统对数据进行理解时才不容易产生错误,因此大多数应用编程都不推荐对存储对象进行强制类型转换操作。然而,以C语言为例,对系统级编程、嵌入式编程方面,这种操作是必须的。比如,要验证所使用的系统环境是大端还是小端,可以使用如下方式进行验证:
int a = 0x12345678;
int i = 0;
for(i=0; i<4; i++