gpt4 book ai didi

c - 简单计算器不适用于 C 中的大数字

转载 作者:行者123 更新时间:2023-11-30 18:45:51 24 4
gpt4 key购买 nike

我正在尝试构建一个可以执行乘法和加法的简单计算器。

我有这个代码

#include <stdio.h>
#include <string.h>

long result = 0;
long *resultPointer = &result;

long plus(long *current, long num) {
return (*current + num);
}

long krat(long *current, long num) {
return (*current * num);
}

int main() {
char operator[4];
long num;

printf("%d\n", 0);
while(scanf("%s %li", &operator[0], &num) != EOF){
if (num > 0) {
if (strcmp(operator, "krat") == 0) {
*resultPointer = krat(&result, num);
}

if (strcmp(operator, "plus") == 0) {
*resultPointer = plus(&result, num);
}

printf("%li\n", result);
}
}

return 0;
}

这是程序的输入

plus 123456789
krat 123456789
plus 0
krat 2
krat 3
krat 4
krat 5
krat 6

这是输出

0
123456789
15241578750190521
30483157500381042
91449472501143126
365797890004572504
1828989450022862520
-7472807373572376496

问题是,当数字变得越来越大时,它们就会变成负数。这是变量的内存分配问题吗?如何解决这个问题?

最佳答案

你的变量溢出了。

这里有两个选择。要么找到任意大数字的解决方案(有可以使用的库),要么接受不能使用太大数字的事实。

有符号 64 位整数可以容纳的最大数字(从输出中可以明显看出 long 在您的系统上是 64 位)是 9223372036854775807,无符号 64 位整数可以容纳的最大数字是 18446744073709551615。

值得一提的是,溢出仅对无符号类型有定义的行为。

其他评论

char[4] 不足以容纳“加号”,因为您需要放置 '\0' 的位置。请改用 char[5]

没有理由在此代码中使用指针。除非您有充分的理由,否则我建议更改为:

long plus(long current, long num) {
return current + num;
}

这又意味着您可以完全跳过该功能。您不需要函数来执行两个整数的加法,因为您可以使用 + 运算符来执行此操作。

此外,您对 scanf 的使用也是不安全的。您可以写入超出数组末尾的内容。请执行以下操作: scanf("%4s %li" 请注意 4。它给出了字符串的最大长度。最重要的是,您不应该检查 scanf 中的 EOF。阅读文档了解它实际返回的内容。

关于c - 简单计算器不适用于 C 中的大数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53468809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com