判断机器大小端模式

标签: 大小端判断嵌入式开发大小端模式介绍
103人阅读 评论(0) 收藏 举报
分类:

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

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

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

这里写图片描述

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

① 通过位移操作

#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位

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:250455次
    • 积分:6513
    • 等级:
    • 排名:第3928名
    • 原创:303篇
    • 转载:13篇
    • 译文:89篇
    • 评论:83条
    【目录索引】

    闲适音乐

    博客专栏

    Email: 457086306@qq.com