Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 格式字符串';%g';需要类型为';双倍';,但变量参数1的类型为';长';_C - Fatal编程技术网

C 格式字符串';%g';需要类型为';双倍';,但变量参数1的类型为';长';

C 格式字符串';%g';需要类型为';双倍';,但变量参数1的类型为';长';,c,C,我得到了如下代码标题中所写的警告(不是错误): printf("value=%g\n", 5L); 我明白这不是一个错误,但为什么是一个警告? 尽管long存储了更多的信息,为什么我们可以或不能使用long来代替double。如果long是32位的(我相信它在Windows/MSVC上),它存储的信息要少得多,如果是64位的,它存储的信息量是相同的,因为double是64位的,但使用/解释该信息的方式不同(如符号/指数/尾数) 然而,这在很大程度上偏离了主题。如果printf的实际参数类型与格

我得到了如下代码标题中所写的警告(不是错误):

printf("value=%g\n", 5L);
我明白这不是一个错误,但为什么是一个警告? 尽管
long
存储了更多的信息,为什么我们可以或不能使用
long
来代替
double
。如果
long
是32位的(我相信它在Windows/MSVC上),它存储的信息要少得多,如果是64位的,它存储的信息量是相同的,因为
double
是64位的,但使用/解释该信息的方式不同(如符号/指数/尾数)


然而,这在很大程度上偏离了主题。如果
printf
的实际参数类型与格式说明符不匹配,并且在实践中不匹配它们将不会产生合理/有意义的结果,则C不会定义行为。不要这样做。使用与您拥有的类型相匹配的正确格式说明符,或将其转换为您想要格式化的类型(注意转换可能会丢失信息)。

long
用于存储整数,而
double
用于存储浮点数。在内存中,它们存储为1和0,但方式不同。当您将
%g
用于错误的类型时,您的程序将尝试以错误的方式从内存中读取它。这将导致不正确的输出。

严格来说,它不是警告的原因是
printf
是一个变量函数,其中未指定第一个参数之后的所有参数的类型

因为
printf
是一个语义定义良好的已知函数,编译器可以根据格式字符串对参数进行额外的可选检查。编译器不需要执行这些检查,因此它会生成警告而不是错误

此外,在某些情况下,如果两种类型具有相同的大小和表示形式,则可以“避免”不匹配,例如,在大小均为8字节的系统上,
long
long

也就是说,参数必须与格式说明符匹配。如果不这样做,则调用。这主要是因为
printf
函数的可变性质意味着它的参数不能从一种类型隐式转换为另一种类型


例如,以x64 Linux系统为例,
double
long
都是8字节。这两种类型表示值的方式非常不同,因此可能打印的值不是您所期望的。此外,在此环境中,整数值通常传递给堆栈上的函数,而浮点值则通过浮点寄存器传递,因此,如果你在函数期望长时传递一个
double
,或者反之亦然,它甚至不会在正确的位置读取。

什么不清楚?…警告告诉你所有你需要的…看看你能添加更多细节吗。例如,你的代码不能保证< <代码>长< /C> >与<代码>双< /C> >相同,实际上Visual C++使用32位<代码>长< /> > 64位系统,而<>代码>双< /代码>通常为64位。此外,整数和浮点值在内存中的存储方式不同,它们的位模式也不同。最后,格式说明符和参数类型不匹配会导致未定义的行为。我们不知道如何在不查看原始代码的情况下对现有代码库进行更改。请发布a,并充分解释需要修改的内容。尽管“long”存储了更多信息…………什么?……o_o