我想我有一个整数溢出的问题,我不知道如何修复它。我刚从Python和JS开始学习C,这对我来说都是新的。
我在下面举一个非常简单的例子来说明正在发生的事情。我把一个参数从main
函数传递给另一个函数乘以3,但是当它传递时,数字溢出。数学运算在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;
}
我收到了错误信息
主.c:3:11:警告:'number'的类型默认为'int' [-Wimplicit-int]printf`显示
calc result: 438711637
main result: 3333333333333
4条答案
按热度按时间btqmn9zl1#
编译器警告提示了这个问题--因为你没有明确定义
number
参数的类型,编译器假设它是一个int
。因此,number * 3
也是int
,并且发生整数溢出。要解决这个问题,请将其显式定义为您想要的类型
long long
:3zwtqj6y2#
我想我有一个整数溢出的问题,我不知道如何修复它。我刚从Python和JS开始学习C,这对我来说都是新的。
然后你需要习惯的一件事是,在C中,你必须显式指定每个变量的数据类型,每个函数参数,每个结构或联合成员,以及每个函数的返回类型。注意数组类型包括数组元素的数据类型,指针类型包括指针指向的对象或函数的数据类型。C99和更高版本中的每个表达式都有一个数据类型,可以根据类型转换追溯到一个或多个显式类型声明和/或常量和文字,其数据类型由其形式传达。
原始C提供了默认类型(类型
int
),为了向后兼容,这被带入了C标准的第一个版本。一些编译器仍然支持向后兼容性,但从C99开始,标准C不再提供默认类型。因此,在C99或更高模式下支持它的浏览器实现了扩展。这个函数的问题是:
参数
number
的数据类型尚未声明。这就是警告告诉你的。第二个问题是,这使得函数定义成为K& R风格的,多年来一直不受欢迎,并在C23中删除。虽然你可以在不从K&R风格转换的情况下修复类型问题,但通过将所需的数据类型放在函数参数列表中来转换为ANSI风格会更容易和更好,就像这样:
最后一点:以你的C语言经验水平,你不应该认为编译器发出的任何警告是可消除的。确保您理解并修复了每一个错误,即使编译器可能会在您没有生成可执行文件时生成。
k4ymrczo3#
在C中,当你没有为func参数指定数据类型时,它默认为int。->您将收到警告
main.c:3:11: warning: type of number defaults to int [-Wimplicit-int]
。在C程序中,我们应该记住在我们定义的函数中指定参数的数据类型。
作为示例,我们应该将其定义为
long long
ni65a41a4#
该定义:
是Kernighan &里奇C语言声明参数的老定义方式。
number
参数缺少定义,默认为int
,强制溢出。您可以使用 DEPRECATED 旧的K&R方式解决它:
或者使用新的ANSI-C(不应该说 * 新 *,因为它现在已经很旧了):