我可以输入C的最大整数长度吗?

时间:2014-06-04 16:34:02

标签: c

对于b / m,我试图总结一个整数的数字。例如。如果我输入1234,我得到答案1 + 2 + 3 + 4 = 10.

这适用于长达10位的整数。之后,如果我输入一个11位数的整数,如12345678912,它会给我一个否定答案。

有人可以帮忙解释为什么会这样吗?如果有,我可以绕过它?

谢谢!

#include <stdio.h>

int main(void)
{
    int number, single_digit, sum;

    printf("What number would you like to sum:\n");
    scanf("%i", &number);

    sum = 0;
    while(number != 0)
    {
        single_digit = number % 10;
        sum += single_digit;
        number = number / 10;
    }
    printf("The sum of the number is %i.\n", sum);
    return 0;
}

7 个答案:

答案 0 :(得分:3)

int的最大限制为INT_MAX。您获得-ve值是因为12345678912不适合int的范围并导致整数溢出。

最好将main的正文更改为

sum = 0;
int ch;
printf("Enter the number would you like to sum:\n");
while((ch = getchar()) != '\n' && ch != EOF)
{
    sum += ch - '0';
}
printf("The sum of the number is %i.\n", sum);  

由于getchar一次只能读取单个字符,因此您可以通过将这些字符添加到sum来获得所需的输出。

答案 1 :(得分:3)

是的,整数可以容纳的最大值是INT_MAX(其值取决于您的平台)。

unsigned int可以包含更大(正)的数字,最多可达UINT_MAX

您可以在unsigned longunsigned long long中放入更多内容 - 再次,详细信息是特定于平台的。之后,您正在寻找一个bignum图书馆。


NB。因为你只想总结数字,使用像haccks&#39;方法更简单,不太可能溢出。不过,它仍然有可能。

答案 2 :(得分:0)

这是因为int只有4个字节。这意味着任何大于2 ^ 31的数字都会导致缓冲区溢出。可在此处找到更详细的说明:http://en.wikipedia.org/wiki/Integer_overflow。如果你想绕过它,使用unsigned int代替它,它会让你最多2 ^ 32,但它不会让你有任何负数。

答案 3 :(得分:0)

int类型(通常)是带符号的32位整数(您可以通过打印sizeof(int)*8来查看您的大小以获取位数。

这意味着你可以存储在int中的最大值是2 ^ 32 - 1,但是,因为int已签名,所以范围实际上是该值的一半。

答案 4 :(得分:0)

在C中,特定类型的整数存储在固定数量的内存中。在所有当前架构中,int以32位存储。由于int带有符号,因此最重要的位被分配给符号。这意味着您可以在int中存储的最大整数是2^31 - 1。你看到一个负数,因为你的int溢出到符号位并使其为负数。

答案 5 :(得分:0)

c中的数字类型是有限的。您可以在limits.h中找到最大整数。

您应该将输入读作字符串(char数组)并处理每个字符以允许任意*长度数字。

*总和仍然需要小于max int。输入字符串必须足够大以包含用户写入的内容

答案 6 :(得分:0)

11位数的整数,如12345678912,如果太大而无法放入平台上number的{​​{1}}。

在C中,int范围至少 -32767到32767.在您的平台上,它显然具有-2147483648到+2147483647的范围。

如果代码是一次读取整个整数,则最大位数受各种可用整数类型的范围限制。

C提供了一个名为int的整数类型及其未签名的合作伙伴intmax_t,它通常具有给定平台上可用的最大范围。

uintmax_t

使用64位#include <inttypes.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <math.h> void MaximalSumOFDigits(void) { uintmax_t number; double widthf = log10(UINTMAX_MAX); int widthi = ((int) floor(widthf)) - 1; char buf[widthi + 2]; printf("What number would you like to sum: (up to %d digits)\n", widthi); fgets(buf, sizeof buf, stdin); char *endptr; errno = 0; number = strtoumax(buf, &endptr, 10); if (*endptr != '\n') Handle_UnexpectedInput(); if (errno) // This should not easily happen as buffer has limited length Handle_TooBigANumber(); int sum = 0; while (number > 0) { // avoiding ASCII dependence sum += number % 10; number /= 10; } printf("The sum of the number is %d.\n", sum); } ,允许数字最多为
18446744073709551615(任何19位数字和20位数字)

以上建议用户输入极限为
_9999999999999999999(任何19位数字)