如何用最简单的程序判断大小端问题

如何用最简单的程序判断大小端问题,第1张

#include <stdio.h>

union utype

{

    int i

    char a

}

void main()

{

    union utype u

    u.i = 1

    if (u.a)

        printf("小端\n")

    else

        printf("大端\n")

}

这个关键是判断第一个字节的内容比较而来。和书写顺序一致就是大端,不书写顺序不一致就是小端,随便写了一个小测试程序,源码如下:

#include <cstdio>

char endian()

{

int i = 0x423f3f4C//i存储了4个字符,B??L

return *(char *)&i

}

int main(int ac,char **pav)

{

char ch = endian()

if (ch=='L') printf("little endian!\n")

else if (ch=='B') printf("big endian!\n")

else if (ch=='?') printf("unknow endian!\n")

return 0

}

执行效果如下图所示:

如果是考虑可移植性之类的,你完全可以使用

unsigned  char endian(){int i =  ~0 - 1return *(unsigned char *)(&i)}

大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中(网络上一般都是采用大端模式)

小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中

例如

int a =1;

为0x 00 00 00 01,一个有32bit,4个Byte,内存地址是连续的,如在起始地址为0x400001的内存地址中,

在大端模式下

第一位为0x00(地址为0x400001)

第二位为0x00(地址为0x400002)

第三位为0x00(地址为0x400003)

第四位为0x01(地址为0x400004),高地址保存低字节。

在小端模式下就相反。

在C语言中,关键字union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有 相同的起始地址 。例子如下:

union StateMachine

{

char character

int number

char *str

double exp

}

一个union 只配置一个足够大的空间以来容纳最大长度的数据成员,以上例而言,最大长度是double 型态,所以StateMachine 的空间大小就是double 数据类型的大小。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11148363.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存