直入正题吧~
所谓大端法,就是指数据的高字节放在低地址
所谓小端法,就是指数据的低字节放在低地址
一般,Linux和Windows采用的是小端法表示,Sun是大端法表示。这两种表示其实没区别,但不知道为什么人们总是为之争得面红耳赤…
现在来做个实验,在Linux64平台和Windows64平台检验其小端性:
测试代码:
#include <iostream>
#include <stdio.h>
using namespace std;
typedef unsigned char* ptr;
void show_bytes(ptr bytes, size_t len) {
for (size_t i = 0; i < len; ++i) {
printf("%.16x: %.2x\n",bytes+i, bytes[i]); // 地址+内容
}
cout << "\n";
}
int main() {
int ival;
scanf("%d",&ival);
float fval = (float)ival;
int* pval = &ival;
show_bytes((ptr)&ival,sizeof(ival));
show_bytes((ptr)&fval,sizeof(fval));
show_bytes((ptr)&pval,sizeof(pval));
return 0;
}
Linux实验结果
12345的十六进制表示为0x00 00 30 39
大端法的表示为:
小端法表示为:
Linux是小端机器,从上述实验结果得到验证
Windows实验结果
与Linux实验结果是一致的,因为它们都是小端法机器
小结:
- 无论是大端法机器还是小端法机器,一个数据都是从低位开始,往高位顺序存储的。如上图大端和小端的图示,十六进制数0x 00 00 30 39 都是从78地址开始存储的。只是在大端和小端的情形下,阅读数据的顺序不同而已。
- 大端和小端仅对连续存储的数据显效(大于等于2个字节)。如果是存放字符串,例如存放0x 30 31 32 33 34 35 36这个字符串,因为每个字符仅占一个字节,所以顺序排布即可,不需要考虑大端和小端。
- 64位机器的指针宽度(字长)验证为64位
- 把int强制转为float,字节会改变