计算C程序中的最大int值(1 << 31) - 1

use*_*645 3 c

用gcc(4.6.3)编译它不会产生警告,结果产生-2147483648.

printf ("%d", (1<<31));
Run Code Online (Sandbox Code Playgroud)

编译它会产生"警告:表达式中的整数溢出[-Woverflow]"并产生2147483647作为结果.

printf ("%d". (1<<31)-1);
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么第二个表达式给出整数溢出警告.

Pau*_*l R 12

虽然1<<31对于带符号的32位整数可能是未定义的行为,但它通常会产生最大负32位2的补码整数值(0x80000000 = -2147483648).如果您尝试从此值中减去1,则值下溢并成为最大正值,因此编译器警告.

 1<<31      0x80000000                -2147483648
(1<<31)-1   0x80000000-1 = 0x7fffffff  2147483647 
Run Code Online (Sandbox Code Playgroud)