种瓜大爷

Life is full of sunshine.

判断机器大小端模式

简单介绍一下大小端模式:

         像内核开发,网络开发,以及嵌入式开发都要涉及以位为单位来操作,所以都要考虑大小端问题。

大端模式:数据的高位,存放在地址的低位。
小端模式:数据的高位,存放在地址的高位。

这里写图片描述

介绍三种判断本机大小端模式的程序:

① 通过位移操作

#include <stdio.h>
#include <stdlib.h>

#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))
int main()
{
    char a = 1;
    panduan(a);
    printf("%#x\n",a);
    printf("%#x\n",a>>1);
    return 0;
}

这里写图片描述

地址: 高地址 <<====== 低地址
小端模式存放:0000 0001 >> 1 == 0000 0000
大端模式存放:1000 0000 >> 1 == 0100 0000

② 通过数据类型强制转换

#include <stdio.h>
#include <stdlib.h>

//#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))
int main()
{
    unsigned short a = 1;
    char c = (char)a;
    //panduan(a);
    //printf("%#x\n",a);
    //printf("%#x\n",a>>1);
    printf("%#x\n",a);
    printf("%#x\n",c);
    (c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
    return 0;
}

这里写图片描述

数据类型强制转换,其实本质还是取低8位数来判断。

③ 通过共同体

#include <stdio.h>
#include <stdlib.h>
//#define panduan(x) (x>>1)?(printf("It is big endian\n")):(printf("It is litter endian\n"))

typedef union test{
    int a;
    char c;
}czg;
int main()
{
    czg t;
    t.a = 1;
    //unsigned short a = 1;
    //char c = (char)a;
    //panduan(a);
    //printf("%#x\n",a);
    //printf("%#x\n",a>>1);
    //printf("%#x\n",a);
    //printf("%#x\n",c);
    printf("%#x\n",t.a);
    printf("%#x\n",t.c);
    //(c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
    (t.c)?(printf("It is litter endian\n")):(printf("It is big endian\n"));
    return 0;
}

这里写图片描述

和②本质上是一样的。
       共用体里面的成员共用一个内存空间,而且是从低位开始占用,共用体变量的内存空间大小是该变量中某个占用空间最大的那个成员所占的空间。比如上面的结构体变量的空间就是int a占空间的大小,char c是从低位开始占用,也就是占用int a的低8位

阅读更多

扫码向博主提问

去开通我的Chat快问

czg13548930186

博客专家

非学,无以致疑;非问,无以广识
版权声明:本文为博主原创文章,转载请注明地址【http://blog.csdn.net/czg13548930186】 谢谢! https://blog.csdn.net/czg13548930186/article/details/78080132
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭