[英]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.