计算机大端小端存储理解

#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 @ 2021-02-23 09:23  yongfengnice  阅读(348)  评论(0编辑  收藏  举报