#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的前两个字节。
所以,这是一个小端系统。 但是,我不确定这种方式是否正确,无法了解系统的类型。 这是对的吗?
答案 0 :(得分:5)
当您违反严格别名规则时,您的代码会导致未定义的行为(C标准为§6.5/ 7,C ++为[basic.lval] / 10)。代码通过完全不同类型的左值访问unum
的存储值。使用C ++编译器,上面的代码甚至不会编译,因为禁止在不相关的指针类型之间进行隐式转换。
使用char
或unsigned char
别名从对象表示中访问单个字节,这些类型将从严格别名规则中排除。 Here就是例子。
答案 1 :(得分:1)
对我来说,你提交的代码不能编译,因此我认为你不能做到这一点。但是this post显示了如何解决您正在谈论的问题。
我的编译器:
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)