为什么此代码会生成警告:
Objective-C
虽然相同的代码没有:
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 $
GCC有什么问题吗?因为uint32_t的大小是32位还是不是吗?
答案 0 :(得分:2)
Sizeof以字节为单位返回大小。你应该试试这个:
printf("%d\n", sizeof(uint32_t));
您可能会发现它是4而不是32.如果您想要以位为单位的大小,您可以乘以8:sizeof(uint32_t) * 8
答案 1 :(得分:1)
sizeof(uint32_t)
在您的系统中为4,因此第一个代码获得正确的操作数为(4-8),这是一个负数,因此警告。
在第二个代码中,它是一个正数,所以没有警告。