一、MSB和LSB
数据在计算机中都是以二进制形式存在的,二进制数的最高为就是MSB
,最低位就是LSB。
比如以0x00000001为例:
它的二进制:00000000000000000000000000000001 | | MSB LSB MSB:Most Significant Bit (最高有效位),也就是最高位,最左侧的bit. LSB:Least Significant Bit(最低有效位),也就是最低位,最右侧的bit.
二、高地址字节 与 低地址字节
变量都是占用空间上的,对于多字节类型,有int、short、double等。以int类型变量为例,int类型占四个字节,也就是32位,每个字节空间都有一个确定的地址,平时我们定义一个int类型的变量:
int a = 1;
用一个int类型的指针变量指向a:
int *p = &a;
此时可以用printf函数打印出p的值,一般p的值会是一个类似0xe3f4a451的16进制数,既然每个字节空间都有一个独立的地址,那为什么这里打印int类型的地址只有一个呢?这里的指针p是一个int类型的指针变量,大小为个4个字节,存储的是a变量的地址,然而a变量的地址并不是指四个字节的每个字节的地址,而是这四个字节的第一个字节的地址,用这个地址来代表变量a的地址。a占四个字节,每个字节都有自己的地址,地址最小的为低地址字节,地址最大的为高地址字节。
三、大端模式和小端模式
以0x00000001为例: 0x00 0x00 0x00 0x00 它的二进制: 00000000000000000000000000000001 | | MSB LSB 大端序存储:MSB所在的字节存储在低地址字节空间,LSB所在字节存储高地址字节空间 小端序存储:相反,MSB所在的字节存储在高地址字节空间,LSB所在字节存储在低地址字节空间
四、用指针方式判断大小端模式
#include <stdio.h> int main(void) { int a = 0x00000001; int *p1 = &a; /** *将int指针类型强制转换为char指针类型,进行解引用后只会访问a中第一个字节的内容 *第一个字节默认为低字节,如果为1,说明0x01存储在低字节,为小端模式,否则为大端模式 */ char *p2 = (char*)p1; if(*p2 != 0) { printf("小端模式\n"); printf("*p2 = 0x%x\n", *p2); } else { printf("大端模式"); printf("*p2 = 0x%x\n", *p2); } return 0; }
Linux下gcc编译运行结果:
五、总结
如果Intel或AMD CPU,基本都是小端序的。ARM则不一定,有些是大端的,有些是小端的。51单片机是大端序的。
新人才疏学浅,有错的地方敬请指正!!
本文来自博客园,作者:夏末终年,转载请注明出处:https://www.cnblogs.com/xiamozhongnian/p/15857475.html