gpt4 book ai didi

c - C 中的隐式类型转换

转载 作者:太空狗 更新时间:2023-10-29 17:11:24 25 4
gpt4 key购买 nike

我在维基百科 (http://en.wikipedia.org/wiki/Type_conversion#Implicit_type_conversion) 上偶然发现了以下示例。

#include <stdio.h>

int main()
{
int i_value = 16777217;
float f_value = 16777217.0;
printf("The integer is: %i\n", i_value); // 16777217
printf("The float is: %f\n", f_value); // 16777216.000000
printf("Their equality: %i\n", i_value == f_value); // result is 0
}

他们的解释是:“这种奇怪的行为是由于 i_value 在与 f_value 进行比较时隐式转换为 float 造成的;这种转换失去了精度,使得比较的值不同。”

这不是错了吗?如果将 i_value 强制转换为 float ,则两者的精度损失相同,并且它们将相等。所以 i_value 必须转换为 double。

最佳答案

不,在相等运算符的情况下,“通常的算术转换” 发生,开始于:

  • First, if the corresponding real type of either operand is long double, the other operand is converted, without change of type domain, to a type whose corresponding real type is long double.
  • Otherwise, if the corresponding real type of either operand is double, the other operand is converted, without change of type domain, to a type whose corresponding real type is double.
  • Otherwise, if the corresponding real type of either operand is float, the other operand is converted, without change of type domain, to a type whose corresponding real type is float.

最后一种情况适用于此:i_value 转换为 float

你可以从比较中看到一个奇怪的结果的原因,尽管如此,是因为对通常的算术转换的警告:

The values of floating operands and of the results of floating expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.

这就是正在发生的事情:转换后的 i_value 的类型仍然是 float,但是在这个表达式中你的编译器正在利用这个纬度并将它表示为更大的精度高于 float。这是针对 387 兼容浮点进行编译时的典型编译器行为,因为编译器会在浮点堆栈上留下临时值,浮点堆栈以 80 位扩展精度格式存储 float 。

如果您的编译器是 gcc,您可以通过提供 -ffloat-store 命令行选项来禁用此额外精度。

关于c - C 中的隐式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com