这段代码是真的知道系统是小端还是大端?

时间:2014-10-11 12:42:41

标签: c endianness

#include<stdio.h>
int main()                                                                                                                              
{
    unsigned int unum = 0x80008001;
    short unsigned int *snum = (short unsigned int*)&unum;
    printf("%d\n", *snum);
    printf("%d\n", *(snum+1));
    return 0;
}

输出:

32769
32768

snum指向unum的最初两个字节,但它的值是unum的最后两个字节,并且在递增指针之后,value是unum的前两个字节。

所以,这是一个小端系统。 但是,我不确定这种方式是否正确,无法了解系统的类型。 这是对的吗?

2 个答案:

答案 0 :(得分:5)

当您违反严格别名规则时,您的代码会导致未定义的行为(C标准为§6.5/ 7,C ++为[basic.lval] / 10)。代码通过完全不同类型的左值访问unum的存储值。使用C ++编译器,上面的代码甚至不会编译,因为禁止在不相关的指针类型之间进行隐式转换。

使用charunsigned char别名从对象表示中访问单个字节,这些类型将从严格别名规则中排除。 Here就是例子。

答案 1 :(得分:1)

对我来说,你提交的代码不能编译,因此我认为你不能做到这一点。但是this post显示了如何解决您正在谈论的问题。

我的编译器:

Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)