簡體   English   中英

刪除左移位數> =類型警告的寬度

[英]removing left shift count >= width of type warning

為什么此代碼會生成警告:

niko: snippets $ cat leftshift.c 
#include <stdint.h>
#include <stdio.h>

int main(void) {

    uint32_t var1;
    uint32_t var2;

    var1=55;
    var2=var1 << (sizeof(uint32_t)-8);

    printf("%d\n",var2);
}
niko: snippets $ gcc -g -Wl,--warn-common -ffunction-sections -fshort-enums -fdata-sections -Wall -Wextra -Wunreachable-code -Wmissing-prototypes -Wmissing-declarations -Wunused -Winline -Wstrict-prototypes -Wimplicit-function-declaration -Wformat  -D_GNU_SOURCE -fshort-enums -std=c99  -c leftshift.c 
leftshift.c: In function ‘main’:
leftshift.c:10:12: warning: left shift count >= width of type [-Wshift-count-overflow]
  var2=var1 << (sizeof(uint32_t)-8);
            ^
niko: snippets $ 

雖然這個相同的代碼沒有:

niko: snippets $ cat leftshift.c 
#include <stdint.h>
#include <stdio.h>

int main(void) {

    uint32_t var1;
    uint32_t var2;

    var1=55;
    var2=var1 << (32-8);

    printf("%d\n",var2);
}
niko: snippets $ gcc -g -Wl,--warn-common -ffunction-sections -fshort-enums -fdata-sections -Wall -Wextra -Wunreachable-code -Wmissing-prototypes -Wmissing-declarations -Wunused -Winline -Wstrict-prototypes -Wimplicit-function-declaration -Wformat  -D_GNU_SOURCE -fshort-enums -std=c99  -c leftshift.c 
niko: snippets $ 

海灣合作委員會有什么問題嗎? 因為uint32_t的大小是32位還是不是?

Sizeof以字節為單位返回大小。 你應該試試這個:

printf("%d\n", sizeof(uint32_t));

您可能會發現它是4而不是32.如果您想要以位為單位的大小,您可以乘以8: sizeof(uint32_t) * 8

sizeof(uint32_t)在你的系統中是4,所以第一個代碼得到正確的操作數為(4-8),這是一個負數,因此警告。

在第二個代碼中,它是一個正數,所以沒有警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM