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

直入正题吧~

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

一般,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,字节会改变
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值