代码之家  ›  专栏  ›  技术社区  ›  intelis

简单计算器在C语言中不能处理大数字

  •  -1
  • intelis  · 技术社区  · 7 年前

    我有这个密码

    #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
    

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   klutt    7 年前

    您正在溢出变量。

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

    有符号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。它给出了字符串的maxlength。最重要的是,你不应该检查 斯坎夫 EOF . 阅读文档,了解它实际返回的内容。

        2
  •  0
  •   Hamid Ghasemi    7 年前

    long 大小至少为32位(根据 Fundamental Types (C++) (Microsoft website) C++ Data Types (tutorialspoint website)

    阅读 C++数据类型(教程网站) 关于C++中每个变量的大小以及维基百科也有很好的文章 one's complement two's complement .