对大端法和小端法存储数据的一些理解

直入正题吧~
所谓大端法,就是指数据的高字节放在低地址
所谓小端法,就是指数据的低字节放在低地址
一般,Linux和Windows采用的是小端法表示,Sun是大端法表示。这两种表示其实没区别,但不知道为什么人们总是为之争得面红耳赤…
【对大端法和小端法存储数据的一些理解】现在来做个实验,在Linux64平台和Windows64平台检验其小端性:
测试代码:

#include #include 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,字节会改变

    推荐阅读