【问题标题】:negative number is printing负数正在打印
【发布时间】:2018-10-10 03:57:05
【问题描述】:

我是 C 编程新手,正在尝试理解数据类型。

我指定了以下变量:

  int nsamples = 10000000;
  int n = 32;
  int m = 64;


  int nrpoinnts = n*m*nsamples+99;
  printf("Nr points %d\n",nrpoinnts);

由于某种原因,打印的数字是负数。为什么会这样?我坚持超过了nrpoints的值范围,所以我检查了两倍。最终的结果是我也得到了负值。

【问题讨论】:

  • 因为它溢出了最大正 32 位整数。尝试使用 long long integer 和 %lld。
  • 检查integer overflow以获得正确的解释。
  • 如果要使用double检查值,则需要在计算中将nmnsamples中的至少一个强制为浮点值,否则使用整数运算完成计算并将结果转换为double。因此:double num_points = (double)n * m * nsamples + 99; 将产生一个正浮点值。

标签: c


【解决方案1】:

您正在使用的有符号int 或只是int 的限制/范围,即使在具有 4 字节整数的 64 位机器上也是 2,147,483,647(作为其最大值)和 -2,147,483,648(作为其最小值) - 您尝试生成/打印的值是 20480000000,大​​于限制/范围 - 因此它包装并产生 -ve 结果。

例子:

#include<stdio.h>

int main()
{
    printf("%d\n",2147483647+1);
    return 0;
}

输出: −2147483648

使用 long unsigned 而不是 int 来包含结果。

【讨论】:

    【解决方案2】:

    你的乘法值是20,480,000,000。 如果 int 在您的系统上是 4 个字节长,那么它可以拥有的最大值是 2,147,483,647。 您可以检查limits.h 中定义的INT_MININT_MAX 宏的值 这两个宏的值都取决于编译器,因为sizeof(int) 是在 C 和 C++ 中定义的实现。

    当超过此INT_MAX 值时,它会在此特定实例中打印一个负值。但请注意,根据标准,有符号整数溢出是未定义的行为

    因此,您可以使用unsigned long long 而不是int 来存储算术运算的值。

    【讨论】:

    • "那么它可以有的最大值是 4,294,967,295":不完全是,记住 int 是签名的。
    • 已更新,谢谢。
    【解决方案3】:

    改变

     int nrpoinnts
    

     unsigned long int nrpoinnts
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2011-04-16
      • 2016-01-07
      • 1970-01-01
      • 2013-02-18
      • 2022-10-26
      • 1970-01-01
      相关资源
      最近更新 更多