负数正在打印

时间:2018-10-10 03:57:05

标签: c

我是C编程的新手,试图理解数据类型。

我指定了以下变量:

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


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

由于某些原因,打印的号码为负数。为什么会这样呢?我认为nrpoinnts的值范围已超出,因此我检查了两倍。最终结果是我也得到了负值。

3 个答案:

答案 0 :(得分:5)

您正在使用的已签名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

使用 unsigned long 代替int来包含结果。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:2)

更改

 int nrpoinnts

 unsigned long int nrpoinnts