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

直入正题吧~

所谓大端法,就是指数据的高字节放在低地址
所谓小端法,就是指数据的低字节放在低地址

一般,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实验结果

对大端法和小端法存储数据的一些理解_第1张图片
12345的十六进制表示为0x00 00 30 39
大端法的表示为:
对大端法和小端法存储数据的一些理解_第2张图片
小端法表示为:
对大端法和小端法存储数据的一些理解_第3张图片
Linux是小端机器,从上述实验结果得到验证

Windows实验结果

对大端法和小端法存储数据的一些理解_第4张图片
与Linux实验结果是一致的,因为它们都是小端法机器

小结:

  • 无论是大端法机器还是小端法机器,一个数据都是从低位开始,往高位顺序存储的。如上图大端和小端的图示,十六进制数0x 00 00 30 39 都是从78地址开始存储的。只是在大端和小端的情形下,阅读数据的顺序不同而已。
  • 大端和小端仅对连续存储的数据显效(大于等于2个字节)。如果是存放字符串,例如存放0x 30 31 32 33 34 35 36这个字符串,因为每个字符仅占一个字节,所以顺序排布即可,不需要考虑大端和小端。
  • 64位机器的指针宽度(字长)验证为64位
  • 把int强制转为float,字节会改变

你可能感兴趣的:(闲聊)