※ 引述《final01 (牛顿运动定律)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Linux
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: 问题(Question):
: #include <stdio.h>
: void print_x(unsigned long x)
: {
: printf("=> 0x%lx\n",x);
: }
: int main()
: {
: print_x(0x80000000);
: print_x((1<<31));
: }
: 想问为何同样是数字一个不会overflow 一个会??
: 喂入的资料(Input):
: 0x80000000
: 1<<31
我猜测你平台的 long 是 64bit。
0x80000000 的 type 是 unsigned int, 所以是 2147483648。
1<<31 运算后结果 0x80000000 的 type 是 int, 所以是 -2147483648。
很奇怪, 一个是 unsigned int, 一个却是 int 是吧!
把 int -2147483648 传给 unsigned long 时, 16 进位便是 0xffffffff80000000,
而不是 80000000。