の左シフト・カウント> =幅を削除する:この同じコードがいない間このコードは警告を生成ないのはなぜタイプの警告
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 $
はGCCに何か問題はありますか? uint32_tのサイズは32ビットなので、そうではありませんか?
愚かな私。ありがとう! – Nulik
'%d'は' size_t'が返す 'size_t'の型指定子が間違っていることに注意してください。代わりに '%zu'を使用するか、引数を型指定子に一致する型にキャストします。 – user694733
'sizeof(uint32_t)* CHAR_BIT'は移植性が高く、自己文書化しています。 OTOH 'CHAR_BIT == 8'は非常に一般的です。 – chux