计算机大端小端的判断
今天参加北京数码视讯笔试遇到这题,现在就总结一下。
判断之前先说一下什么是大端什么是小端。
大端格式:高地址放低位,低地址放高位。
小端格式:高地址放高位,低地址放地位。
采用Little-endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big-endian模式对操作数的存放方式是从高字节到低字节。例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
而在Big-endian模式CPU内存中的存放方式则为:
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 存放内容 |
0x4000 | 0x34 |
0x4001 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 存放内容 |
0x4000 | 0x12 |
0x4001 | 0x34 |
32bit宽的数0x12345678在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 | 存放内容 |
0x4000 | 0x78 |
0x4001 | 0x56 |
0x4002 | 0x34 |
0x4003 | 0x12 |
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 | 存放内容 |
0x4000 | 0x12 |
0x4001 | 0x34 |
0x4002 | 0x56 |
0x4003 | 0x78 |
判断程序:
例1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned short test = 0x1122;
if((*((unsigned char*) & test)) == 0x11)
printf("big\n");
else
printf("little\n");
return 0;
}
例2
int checkCPU(){
{
union w
{
int a;
char b;
} c;
c.a = 1;
return (c.b == 1);
}
}
如果是小端存储返回1,大端存储返回0. 感觉这个函数很巧妙,利用union的特点,来判断内存的存储形式。
union用途:是不同类型的变量占用同一内存; 结构体长度:等于最长的成员变量的长度;