簡體   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