对于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;
}
答案 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 long
或unsigned 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位数字)