所以我有以下内容,
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'时,我总会得到一个负数,有人可以告诉我为什么吗?
答案 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
或仅long
或size_t
或int64_t
,每个至少64位。
进行比较:
为什么否定?
负数是因为signed int
位于-32767 to 32767
之间
然后32767表示为溢出。因此,在截断溢出后,这将是一个负数。
另请注意,
sizeof
a类型由编译器确定, 它不必与实际硬件有任何关系 (虽然它通常会这样做);实际上,不同的编译器是相同的 机器可以有不同的值。