问题描述
下面的代码在编译后会引发由第9行引起的警告:
警告:移位计数> = [-Wshift-count-overflow]类型的宽度
但是,即使k == 32
(我相信),第8行也不会发出类似的警告。我很好奇为什么会发生这种现象?我正在使用gcc
编译器系统。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int bit_shift(unsigned x,int i){
int k = i * 8;
unsigned n = x << k; /* line 8 */
unsigned m = x << 32; /* line 9 */
return 0;
}
int main(){
bit_shift(0x12345678,4);
return 0;
}
解决方法
k
中bit_shift
的值取决于参数i
。而且由于未声明bit_shift
static
,因此有可能可以从其他翻译单元(读取:其他源文件)中调用它。
因此,无法在编译时确定此偏移将始终是一个问题。这与行unsigned m = x << 32;
始终偏移无效量相反。
我认为第8行为何不发出警告,是因为将未签名的int32> = 32位左移不是未定义的行为。
C标准(N2716,6.5.7位移位运算符)说:
E1