提问人:Derrick Mei 提问时间:9/3/2023 最后编辑:chqrlieDerrick Mei 更新时间:9/4/2023 访问量:123
在 C 中传递参数时的整数溢出
Integer Overflow when Passing Arguments in C
问:
我想我遇到了整数溢出问题,我不确定如何解决它。我刚从 Python 和 JS 开始使用 C,这对我来说都是新的。
我在下面举了一个非常简单的例子来说明正在发生的事情。我正在将一个参数从函数传递到另一个函数以乘以 3,但是当它传递时,数字会溢出。数学在函数中起作用。main
main
#include <stdio.h>
long long calc(number) {
return number * 3;
}
int main(void)
{
long long digits = 1111111111111;
long long result = calc(digits);
printf("calc result: %lld\n", result);
long long mainTimes3 = digits * 3;
printf("main result: %lld\n", mainTimes3);
return 0;
}
我收到错误消息
main.c:3:11:警告:“number”的类型默认为“int” [-Wimplicit-int]”
正在显示printf
calc result: 438711637
main result: 3333333333333
答:
编译器警告提示了该问题 - 由于您没有显式定义参数的类型,因此编译器假定它是 .因此也是一个 ,并且会发生整数溢出。number
int
number * 3
int
要解决此问题,请将其显式定义为您想要的类型:long long
long long calc(long long number){
/* Here ---^ */
return number * 3;
}
评论
在 C 中,当您未为 func 参数指定数据类型时,它默认为 int。
->您收到警告。main.c:3:11: warning: type of number defaults to int [-Wimplicit-int]
在 C 程序中,我们应该记住在我们定义的函数中指定参数的数据类型。
作为您的示例,我们应该将其定义为long long
long long calc(long long number){}
评论
我想我遇到了整数溢出问题,我不确定如何解决它。我刚从 Python 和 JS 开始使用 C,这对我来说都是新的。
然后,您需要习惯的一件事是,在 C 语言中,您必须显式指定每个变量、每个函数参数、每个结构或联合成员的数据类型,以及每个函数的返回类型。请注意,数组类型包括数组元素的数据类型,指针类型包括指针指向的对象或函数的数据类型。C99 及更高版本中的每个表达式都有一个数据类型,该数据类型可能根据类型转换可以追溯到一个或多个显式类型声明和/或数据类型通过其形式传达的常量和文字。
原始 C 对默认类型(键入)和向后兼容性进行了规定,这被延续到 C 标准的第一个版本中。一些编译器仍然支持(仍然)向后兼容,但从 C99 开始,标准 C 不提供默认类型。因此,在(否则)C99 或更高版本模式下支持它的编译器正在实现扩展。int
因此,此函数的问题:
long long calc(number){ return number*3; }
表示参数的数据类型尚未声明。这就是警告告诉你的。number
第二个问题是,这使得函数定义成为K&R风格的定义,多年来一直不受欢迎,并在C23中被删除。虽然您可以在不从 K&R 样式转换的情况下解决键入问题,但通过将所需的数据类型放入函数参数列表中,转换为 ANSI 样式会更容易更好,如下所示:
long long calc(long long number) {
return number * 3;
}
最后注意:以你的 C 经验水平,你不应该认为编译器发出的任何警告都是可以忽略的。确保您理解并修复每个问题,即使编译器可能会在您尚未生成可执行文件时生成可执行文件。
这个定义:
long long calc(number) {
return number * 3;
}
是旧的 Kernighan & Ritchie C 语言定义参数声明方式。缺少定义的参数默认为 ,以强制执行溢出。number
int
您可以使用已弃用的旧 K&R 时尚来解决它:
long long calc(number)
lont long number;
{
...
或者使用新的 ANSI-C(不应该说新的,因为它现在已经很旧了):
long long calc(long long number)
{
...
评论
long long calc(long long number)
int
number * 3
int
)C
C23
int
int