在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对表示一个对象的字节序列有两种方法:大端法和小端法。
区别
主要区别在于存放的字节顺序,高序字节存放在低地址成为大端,低序字节存放在低地址成为小端。
在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示(最高字节MSB(Most Significant Byte))(最低字节LSB(Least Significant Byte))
地址偏移 | 大端模式 | 小端模式 |
---|---|---|
0x00 | 12(MSB) | 78(LSB) |
0x01 | 34 | 56 |
0x02 | 56 | 34 |
0x03 | 78(LSB) | 12(MSB) |
确定方法
在网上收集了几种确定机器是大端法还是小端法的方法代码如下:
法一
#include<stdio.h>
union node
{
int a;
char b[4];
};
int main()
{
union node t;
t.a=1;
printf("%d\n",t.b[0]);
printf("%d\n",t.b[1]);
printf("%d\n",t.b[2]);
printf("%d\n",t.b[3]);
}
//把int的每个字节读出来。要是第一个字节为0证明是大端模式 第一个字节为1证明是小端模式
发二:通过读取同一地址的整型数据和字符数据来区别大端和小端
1 unsigned int data,* point;
2 point=&data;//获取整型数据的地址,保存在point中
3 data=0;
4 *(type *) point= 0x22;
5 if(data==0x22)
6 {
7 cout<< "此处理器是小端!"<<endl;
8 }
9 else if(data==0x22000000)
10 {
11 cout<< "此处理器是大端!"<<endl;
12 }
13 else
14 {
15 cout<< "暂时无法判断机器类型!"<<endl;
16 }