C 函数的作用是:返回奇怪的数字

C 函数的作用是:返回奇怪的数字,c,C,在我的程序中,我需要总是得到比参数大的最接近的整数值。为此,我使用Cceil()函数。 问题是它总是返回我不期望的数字 例如 在我的程序的前面部分,我调用了srand(time(NULL)),所以我认为这可能与此有关,我把它注释掉了,但没有任何帮助 当我像这样调用函数ceil(0.04000001)时,它也返回1018。 即使我使用文档中的参数调用函数,它也有这种奇怪的行为 示例程序 //#include <stdio.h> //#include <stdlib.h>

在我的程序中,我需要总是得到比参数大的最接近的整数值。为此,我使用C
ceil()
函数。 问题是它总是返回我不期望的数字

例如

在我的程序的前面部分,我调用了
srand(time(NULL))
,所以我认为这可能与此有关,我把它注释掉了,但没有任何帮助

当我像这样调用函数ceil(0.04000001)时,它也返回1018。 即使我使用文档中的参数调用函数,它也有这种奇怪的行为

示例程序

//#include <stdio.h>
//#include <stdlib.h>

int main() {

    //double var = 1 / 25.0;
    double num1 = ceil(1.6);    // returns 1023

    return 0;
}
/#包括
//#包括
int main(){
//双var=1/25.0;
double num1=ceil(1.6);//返回1023
返回0;
}

正如注释中指出的,
ceil
返回一个
double
,但是如果没有为函数指定原型,编译器必须假设函数返回
int
,并且参数的类型(应用后)与函数参数的类型相同。调用实际函数时,由于参数的类型错误(
ceil
需要一个
double
,但您给它传递了一个
int
),因此行为未定义

在许多现代系统中,浮点参数和整数值参数甚至不在同一寄存器中传递。因此,在这种情况下,
ceil
查找
double
参数时,很可能只在寄存器中找到浮点参数的垃圾;调用者需要一个
int
返回值,只在整数返回的寄存器中找到任何垃圾


编译器应该警告您在默认情况下调用非类型化函数。检查警告,您将避免此类问题。

正如注释中指出的,
ceil
返回一个
double
,但是如果您没有为函数指定原型,编译器必须假设函数返回
int
,并且参数类型(在应用与函数参数的类型相同。调用实际函数时,由于参数的类型错误(
ceil
需要一个
double
,但您给它传递了一个
int
),因此行为未定义

在许多现代系统中,浮点参数和整数值参数甚至不在同一寄存器中传递。因此,在这种情况下,
ceil
查找
double
参数时,很可能只在寄存器中找到浮点参数的垃圾;调用者需要一个
int
返回值,只在整数返回的寄存器中找到任何垃圾


编译器应该警告您在默认情况下调用非类型化函数。检查警告,您将避免此类问题。

我们需要一个解决方案,如何检查返回值?是否包含math.h?没有正确的原型C假定
intCeil(int)我正在通过VS调试器检查值。所以问题是@akishuihkonen指出的原型不正确。你能解释一下有什么不同吗?我们需要一个答案。你是如何检查返回值的?你有没有包括math.h?没有正确的原型C假定
intCeil(int)我正在通过VS调试器检查值。所以问题是@akishuihkonen指出的原型不正确。您能解释一下区别吗?在x64等寄存器丰富的体系结构上,浮点数和整数很可能在不同的寄存器中传递,因此
ceil
在错误的位置查找参数,并获取浮点寄存器中的所有垃圾,您在错误的位置查找返回值,并获取整数寄存器中的所有垃圾。因此,返回的值和传递的值之间不一定有任何关联。@trentcl因为答案是community wiki,所以不需要注释。您可以编辑并改进答案。在x64等寄存器丰富的体系结构上,浮点数和整数很可能在不同的寄存器中传递,因此
ceil
在错误的位置查找参数,并获取浮点寄存器中的所有垃圾,您在错误的位置查找返回值,并获取整数寄存器中的所有垃圾。因此,返回的值和传递的值之间不一定有任何关联。@trentcl因为答案是community wiki,所以不需要注释。您可以编辑并改进答案。
//#include <stdio.h>
//#include <stdlib.h>

int main() {

    //double var = 1 / 25.0;
    double num1 = ceil(1.6);    // returns 1023

    return 0;
}