班次计数<类型的宽度,它按预期工作:
int a = 1 << (8 * sizeof(int) - 1);
printf("%x\n", a); // 80000000
当移位数&gt; =类型宽度时,结果每次都不同,似乎没有法则:
int b = 1 << 8 * sizeof(int); // int b = 1 << (8 * sizeof(int) + 1);
printf("%x\n", b); // such as 59fa2ba8, 5b0f6ba8, 52f46ba8 etc
嗯,有一个警告说 警告:班次计数&gt; =类型[-Wshift-count-overflow]的宽度 。如果这可以解释随机结果,那么让我把班次计数变成一个变量:
int k = 8 * sizeof(int);
int c = 1 << k;
int d = 1 << (k + 1);
printf("%x\n", c); // 1
printf("%x\n", d); // 2
结果与以前完全不同,这是循环移位!怎么解释这个?
答案 0 :(得分:3)
int b = 1 << 8 * sizeof(int);
受到未定义的行为。
来自C99标准:
6.5.7按位移位运算符
3对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。
尝试理解这种操作的结果是毫无意义的。