%操作后的奇数负数

时间:2014-02-25 12:18:17

标签: c

所以我有以下内容,

int main()
{
    int a[10];
    int i=0;
    int n=10000000000;
    while (n!=0)
    {
        a[i++]=n%10;
        printf("we have n  is %d\n", n);
        printf("we have n mod 10 is %d\n", n%10);
        n/=10;
        printf("we have%d\n", a[i]);
    }

当n mod 10为'0'时,我总会得到一个负数,有人可以告诉我为什么吗?

2 个答案:

答案 0 :(得分:11)

int太小,无法容纳这个数字。您正在获得溢出,导致n实际上为负数,因此您获得模运算的负值。

答案 1 :(得分:2)

这个数字远远超过积极的int限制。 您可以运行以下代码来了解操作系统中整数的限制

<强> C:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

<强> C ++:

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

您需要做什么:

选择其他数据类型,例如double。您还可以选择long int或仅longsize_tint64_t,每个至少64位。

进行比较:

  • signed int:-32767 to 32767
  • unsigned int:0到65535
  • 签署长:-2147483647至2147483647
  • unsigned long:0到4294967295

为什么否定?

负数是因为signed int位于-32767 to 32767之间 然后32767表示为溢出。因此,在截断溢出后,这将是一个负数。

  

另请注意,sizeof a类型由编译器确定,   它不必与实际硬件有任何关系   (虽然它通常会这样做);实际上,不同的编译器是相同的   机器可以有不同的值。