大端:高字节放在低地址,低字节放在高地址
小端: 高地址放在高地址,低字节放在低地址
例子如下:
int a = 0x12345678,大小端的各自存放情况如下:
大端存放
-----------------------------------------------
低地址 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 高地址
-----------------------------------------------
小端存放
-----------------------------------------------
低地址 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 高地址
-----------------------------------------------
注意:不管数据是以大端还是小端的方式存放,我们读取的时候都是从低地址开始读取,并且根据变量的类型我们读取的字符个数不同,这一点对于理解大小端来说至关重要,如果变量是int型的,则一次性读取4个字节,相反如果是char型的,则一次性只读取一个字节的数据,其他类型依次类推……,假如,我们需要有如下语句:
unsigned char *ch = (unsigned char *)(&a),此时把a强制转化为char *型的,此时只能读取一个字节的值;
unsigned char a = *ch;则此时根据cpu的大小端架构的不同,从低地址开始读取一个字节的内容可能会出现两个值:
大端的情况下:a = 0x12 //注意,写的是0x12,实际上是由低到高是-->1-->2的顺序
小端的情况下:a = 0x78 //注意,写的是0x78,实际上是由低到高是-->8-->7的顺序
下面自己写一个判断cpu大小端的程序,代码如下:
点击(此处)折叠或打开
-
#include <stdio.h>
- //C语言中并不支持bool类型,而C++中是有,但是C99标准当中,定义了bool类型,需要包含stdbool.h头文件
-
#include <stdbool.h>
-
-
bool is_big_endian()
-
{
-
unsigned int a = 0x12345678;
-
-
//把int型强转为unsigned char 型,目的是只读一个字节的内容
-
return(*((unsigned char *)&a) == 0x12);
-
}
-
-
int main(int argc, const char *argv[])
-
{
-
bool ret;
-
-
ret = is_big_endian();
-
-
if(ret == true)
-
{
-
printf("big endian\n");
-
}
-
else
-
{
-
printf("little endian\n");
-
}
-
-
return 0;
- }
点击(此处)折叠或打开
-
ubuntu@ubuntu:~/interview/c_study$ gcc endian.c
-
ubuntu@ubuntu:~/interview/c_study$ ./a.out
- little endian