繁体   English   中英

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

[英]Bit Shifting: Shift Count >= Width Of Type

下面的代码在编译时抛出由第 9 行引起的警告:

警告:移位计数 >= [-Wshift-count-overflow] 类型的宽度

然而,第 8 行并没有抛出类似的警告,即使k == 32 (我相信)。 我很好奇为什么会发生这种行为? 我正在使用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;
}

bit_shiftk的值取决于参数i 并且因为bit_shift未声明为static ,所以它可能会从其他翻译单元(读取:其他源文件)中调用。

所以它不能在编译时确定这种转变总是有问题。 这与unsigned m = x << 32;行形成对比unsigned m = x << 32; 它总是以无效的数量移动。

我认为为什么第 8 行没有发出警告是因为左移无符号 int32 >= 32 位不是未定义的行为

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

E1 << E2 的结果是 E1 左移 E2 位位置; 空出的位用零填充。 如果 E1 具有无符号类型,则结果的值为 E1 × 2^E2,比结果类型中可表示的最大值减少模 1。 如果 E1 有符号类型和非负值,并且 E1 × 2^E2 在结果类型中是可表示的,那么这就是结果值; 否则,行为未定义

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM