移位:移位计数> =类型的宽度

问题描述

下面的代码在编译后会引发由第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;
}

解决方法

kbit_shift的值取决于参数i。而且由于未声明bit_shift static,因此有可能可以从其他翻译单元(读取:其他源文件)中调用它。

因此,无法在编译时确定此偏移将始终是一个问题。这与行unsigned m = x << 32;始终偏移无效量相反。

,

我认为第8行为何不发出警告,是因为将未签名的int32> = 32位左移不是未定义的行为

C标准(N2716,6.5.7位移位运算符)说:

E1

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...