#include <stdio.h>
#include <stdint.h>
int main(){
uint64_t a = 1 << 63;
/* do some thing */
return 0;
}
$ gcc -Wall -Wextra -std=c99 test.c -o test
warning: left shift count >= width of type [-Wshift-count-overflow]
问:uint64_t
应该有64位宽,为什么左移位操作会溢出?
答案 0 :(得分:7)
1
是int
,它在您的平台上只有32位,或者可能是64位但已签名。
首先使用(uint64_t)1 << 63
将1
转换为64位无符号整数。 (如果您愿意,可以((uint64_t)1) << 63