计算机大端小端存储理解

#include <iostream>

// (short)(x) & (short)0x00ffU 的结果再左移8位<< 8 ,即取低8位再左移8位后变为高8位
// (short)(x) & (short)0xff00U 的结果再右移8位>> 8 ,即取高8位再右移8位后变为低8位
#define sw16(x) (short) ( ((short)(x) & (short)0x00ffU ) << 8 | ((short)(x) & (short)0xff00U)>>8 )

using namespace std;

int main() {
    //0x十六进制2位数占用一个字节(一个字节即8位bit)
    //计算机内存分配是以字节为单位的,比如只申请1位bit会给你分配一个字节即8位哦
    //所以对于内存分配,我们只谈字节不谈位。对于按位计算才考虑位bit。
    //unsigned int 有4个字节空间
    unsigned int value = 0x12345678;//0x12一个字节,0x34一个字节,0x56一个字节,0x78一个字节

    unsigned char buf[4] = {0};//申请4个字节
    //大端:低地址存放高字节
    buf[0] = 0x12;/*0x12高字节*/
    buf[1] = 0x34;
    buf[2] = 0x56;
    buf[3] = 0x78;
    printf("大端buf结果:0x%x%x%x%x\n", buf[0], buf[1], buf[2], buf[3]);

    //小端:低地址存放低字节
    buf[0] = 0x78;/*0x78低字节*/
    buf[1] = 0x56;
    buf[2] = 0x34;
    buf[3] = 0x12;
    printf("小端buf结果:0x%x%x%x%x\n", buf[0], buf[1], buf[2], buf[3]);

    short int x;//2个字节
    char x0, x1;
    x = 0x1122;
    //数据寻址时用的都是低位字节的地址,即从0号地址开始数据寻址。
    x0 = ((char *) &x)[0]; //低地址单元,需要转为(char*)指针再取值不然指针步长不正确
    x1 = ((char *) &x)[1]; //高地址单元,同样需要转为(char*)指针再取值。指针步长才正确。
    printf("x0=x%x\n", x0);//低地址单元,我的计算机输出结果是低字节0x22,所以是低地址存放低字节,是大端存储。
    printf("x1=x%x\n", x1);//我的计算机输出结果是高字节0x11
    printf("大小端转化前x的值=x%x\n", x);
    printf("大小端转化后x的值=x%x\n", sw16(x));
    return 0;
}
posted @   yongfengnice  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示