【问题标题】:Can someone explain why the below code prints -1有人可以解释为什么下面的代码打印 -1
【发布时间】:2020-10-27 22:42:07
【问题描述】:

谁能解释为什么下面的代码输出-1

#include <stdio.h>
main() 
{

int number = 4294967295; /* the maximum integer
that can be represented in 4 bytes (2 ^ 32 -1) */

printf("Maximun Number: %d\n", number); // why this output is strange it prints "-1". outputs: Maximum Number: -1 

printf("sizeof integer: %dbytes", sizeof(int)); // outputs: sizeof integer: 4bytes 

}

如您所见,我已经存储了可以存储在 4bytes 中的最大整数(2 ^ 32 -1)在 int 变量中 C 但我不知道为什么会输出 -1 这太奇怪了.这是undefined behavior这是在C standard 中的某处提到的,如果您提供任何链接,我可以阅读任何解释都非常感谢

【问题讨论】:

  • int 是有符号类型。您所说的“最大整数”是~可以存储在int 中的可能数字的总数,但由于可能数字的负半数,实际可能的最大整数实际上约为一半。
  • 非常感谢,所以在上面的代码中它的整数溢出对吗?
  • 正如@Chris 所说,它被隐式转换为包含所有1 位的long unsigned int。当您尝试将其打印为int 二进制补码时,所有1 位都是十进制的-1

标签: c int 32-bit


【解决方案1】:

42949672952 ^ 32 - 1,但有符号 int 的正数范围是 2 ^ 31 - 1。分配大于此值的值由实现定义(参见链接的 c 标准草案中的signed and unsigned integers):

(3)否则,新类型有符号,值无法表示 在里面;结果是实现定义的或 引发了实现定义的信号。

实现定义的一种行为可以是将完整的 32 位视为二进制补码值。这将产生-1

【讨论】:

    【解决方案2】:

    变量number确实小于2 ^ 32 - 1,但是C中的int类型是有符号整数,这意味着最大值是2147483647,而不是4294967296。

    编译器将您的 long 数字隐式转换为有符号整数,从而将其更改为 -1

    【讨论】:

      【解决方案3】:

      实际上整数的范围是 -2,147,483,648 到 2,147,483,647。因此,您正在生成溢出。如果你打印

      printf("Maximun Number: %ld \n", number); 
      //where %ld is a signed and %lu is an unsigned long
      

      您实际上会得到您正在寻找的输出。

      【讨论】:

        【解决方案4】:

        如果您使用INT_MAX(和#include &lt;limits.h&gt;)代替,您会注意到最大正整数将为2147483647。 这是因为一位用于知道整数的符号。 因此最大可能数为2 ^ 31 -1

        【讨论】:

          猜你喜欢
          • 2016-09-28
          • 1970-01-01
          • 2023-04-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多