#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
", 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
", 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
", x0);//低地址单元,我的计算机输出结果是低字节0x22,所以是低地址存放低字节,是大端存储。
printf("x1=x%x
", x1);//我的计算机输出结果是高字节0x11
printf("大小端转化前x的值=x%x
", x);
printf("大小端转化后x的值=x%x
", sw16(x));
return 0;
}
- 部分芯片采用大端存储,部分芯片采用小端存储。ARM芯片默认采用小端,但可以切换为大端。
- 网络上传输数据普遍采用的都是大端。
- 参考链接:百度百科