【发布时间】:2011-11-17 19:24:40
【问题描述】:
我先是把一个int32数转成char[4]数组,然后通过(int *)把数组转回int32,但是数和以前不一样了:
unsigned int num = 2130706432;
unsigned int x;
unsigned char a[4];
a[0] = (num>>24) & 0xFF;
a[1] = (num>>16) & 0xFF;
a[2] = (num>>8) & 0xFF;
a[3] = num & 0xFF;
x = *(int *)a;
printf("%d\n", x);
输出为 127。如果我设置 num = 127,则输出为 2130706432。 有人有想法吗?
【问题讨论】:
-
你的平台是小端还是大端? en.wikipedia.org/wiki/Endianness你平台上一个int的字节顺序可能不是你想象的那样。
-
@Eric J. 哦,我忘了这个。现在已经解决了,谢谢
-
@DavidHeffernan:它被标记为 C。
-
@zwx:我认为
x = *(int *)a;违反了严格的别名规则(尝试在启用警告的情况下进行编译),在现代 C 中你应该使用联合来进行类型双关(但最好这样做通过位移)。见stackoverflow.com/questions/8143857/… -
@ninjalj:没错。代码实际上是UB。正确的做法是颠倒顺序:
unsigned int x; unsigned char * a = (unsigned char*)(&x);
标签: c