【发布时间】:2016-04-25 00:39:54
【问题描述】:
我定义了一个名为 queryData 的结构,如下面的代码。当我尝试使用 shift 和 right 操作来操作和分配一个数据 qdata.data.data4[0] 时,将数据打印出来,我之前所说的数据是 a char 有问题这是 8 位,但是当我 打印 它实际上是 32 位,0xffffff8b。我想知道怎么会是这样。谢谢你。
int main(void){
union Data{
char data2[2];
char data4[4];
};
struct queryData{
char byte; // 2bytes or 4bytes.
union Data data;
};
struct queryData qdata;
unsigned long int data;
data = rand()%4294967295;
qdata.byte = 4;
qdata.data.data4[0] = (char)(data>>24);
qdata.data.data4[1] = (char)((data<<8)>>24);
qdata.data.data4[2] = (char)((data<<16)>>24);
qdata.data.data4[3] = (char)((data<<24)>>24);
printf("%ld\n",data);
printf("%x\n",qdata.data.data4[0]);
printf("%x\n",qdata.data.data4[1]);
printf("%x\n",qdata.data.data4[2]);
printf("%x\n",qdata.data.data4[3]);
printf("%x",(unsigned int)(1804289383<<8)>>24);
return EXIT_SUCCESS;
}
结果如下: The result after run
【问题讨论】:
-
右移有符号值是实现定义的。并且左移可以调用未定义的行为。使用无符号固定宽度类型!
-
哦,还有不要发布链接或文字图片
-
Signed right shift = strange result?。不要使用像 4294967295 这样的幻数,而是使用
0xFFFFFFFF或~0u
标签: c