利用指针判断大小端模式

一、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
posted @ 2022-01-30 19:58  夏末终年  阅读(292)  评论(0编辑  收藏  举报