printf(“%d \ n”,4294967296); 犯了一些奇怪的错误

Jac*_*son 1 c visual-studio-2017

(4294967296 = 2 ^ 32)

我想4294967296使用printf(“%u,%d”)进行打印,并想知道会发生什么,但是得到一些奇怪的结果。

代码如下:

printf("%d\n", 4294967296);

printf("d = %u = %d = 0x%x  \n", 4294967296, 4294967296, 4294967296);//this is strange

printf("d = %u = %d = 0x%x  \n", 4294967295 + 1, 4294967295 + 1, 4294967295 + 1);
Run Code Online (Sandbox Code Playgroud)

我的结果是

0

d = 0 = 1 = 0x0

d = 0 = 0 = 0x0
Run Code Online (Sandbox Code Playgroud)

结果图

您可以在第二行中看到4294967296的二进制表达式是0x0,但是当我打印4294967296使用“%d”时,它将显示1,这让我感到困惑。我期望1的输出为0。

Som*_*ude 5

如果受支持,则该值为4294967296a long long,因为它不适合unsigned int

格式"%d"用于int(带符号的 int)。

值类型和格式说明符不匹配会导致未定义的行为

该值4294967295 确实适合,unsigned int但随后您添加了1使其溢出。

32位无符号整数的范围是02³²-1(包括)。

  • “值4294967295确实适合无符号int”是正确的,但是`4294967295`仍然是C99以来的“ long long”(十进制常数)。“加1使它溢出”->不,总和是long long4294967296。对于C89,您的答案是正确的,其中4294967295是unsigned long(并且加法1是明确定义的)。 (2认同)