C中传递参数时的溢出

mlnl4t2r  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(117)

我想我有一个整数溢出的问题,我不知道如何修复它。我刚从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
btqmn9zl

btqmn9zl1#

编译器警告提示了这个问题--因为你没有明确定义number参数的类型,编译器假设它是一个int。因此,number * 3也是int,并且发生整数溢出。
要解决这个问题,请将其显式定义为您想要的类型long long

long long calc(long long number){
    /* Here ---^ */
    return number * 3;
}
3zwtqj6y

3zwtqj6y2#

我想我有一个整数溢出的问题,我不知道如何修复它。我刚从Python和JS开始学习C,这对我来说都是新的。
然后你需要习惯的一件事是,在C中,你必须显式指定每个变量的数据类型,每个函数参数,每个结构或联合成员,以及每个函数的返回类型。注意数组类型包括数组元素的数据类型,指针类型包括指针指向的对象或函数的数据类型。C99和更高版本中的每个表达式都有一个数据类型,可以根据类型转换追溯到一个或多个显式类型声明和/或常量和文字,其数据类型由其形式传达。
原始C提供了默认类型(类型int),为了向后兼容,这被带入了C标准的第一个版本。一些编译器仍然支持向后兼容性,但从C99开始,标准C不再提供默认类型。因此,在C99或更高模式下支持它的浏览器实现了扩展。
这个函数的问题是:

long long calc(number){
    return number*3;
}

参数number的数据类型尚未声明。这就是警告告诉你的。
第二个问题是,这使得函数定义成为K& R风格的,多年来一直不受欢迎,并在C23中删除。虽然你可以在不从K&R风格转换的情况下修复类型问题,但通过将所需的数据类型放在函数参数列表中来转换为ANSI风格会更容易和更好,就像这样:

long long calc(long long number) {
    return number * 3;
}

最后一点:以你的C语言经验水平,你不应该认为编译器发出的任何警告是可消除的。确保您理解并修复了每一个错误,即使编译器可能会在您没有生成可执行文件时生成。

k4ymrczo

k4ymrczo3#

在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){}
ni65a41a

ni65a41a4#

该定义:

long long calc(number) {
    return number * 3;
}

是Kernighan &里奇C语言声明参数的老定义方式。number参数缺少定义,默认为int,强制溢出。
您可以使用 DEPRECATED 旧的K&R方式解决它:

long long calc(number)
lont long number;
{
    ...

或者使用新的ANSI-C(不应该说 * 新 *,因为它现在已经很旧了):

long long calc(long long number)
{
    ...

相关问题