【发布时间】:2017-05-18 18:05:24
【问题描述】:
#include <stdio.h>
int main(void)
{
unsigned int var=1;
var = var<<32;
printf("%u ",var);
}
此代码产生1 作为其输出。如果我写var = var<<31; 它会产生2147483648。
如果我输入var = 12;,然后输入var = var<<32;,它将产生12。我从我的旧教科书中读到,ANSI C 不允许在一次操作中将所有位移出一个值。
当我指示 GCC 执行 var = var<<32; 时,所有主要编译器的行为是否相同(将输入复制粘贴到输出)或者只是 GCC 将粘贴 12 从输入复制到输出????
【问题讨论】:
-
移动的位数多于数据类型中的位数会导致未定义的行为。因此将 32 位变量移动 32 位(或更多)位是无效的。
-
@Badda 这不是一个有意义的重复,因为 C 在位移方面有很多特定于语言的行为。
-
这是未定义的行为,因为
32超出范围 [0 - 31]。