为什么C在float不能表示所有int值时将int提升为float?

说我有以下:

int i = 23;
float f = 3.14;
if (i == f) // do something

我将被提升为一个浮点数和两个浮点数将被比较,但是一个float可以表示所有int值?为什么不提升int和float两者呢?

最佳答案
当int在整数提升中被提升为unsigned时,负值也会丢失(这导致了0u <-1成立的乐趣)。 像C中的大多数机制(在C中继承)一样,通常的算术转换应当根据硬件操作来理解。 C的制造者非常熟悉他们工作的机器的汇编语言,并且他们编写C对自己和人类自己做出直接的感觉,当编写直到那时将被编写的东西(例如UNIX核心)。 现在,处理器通常不具有混合类型的指令(将float添加到double,比较int和float等等),因为这将是晶片上的实际空间的巨大浪费 – 你必须实现作为您希望支持不同类型的操作码的次数。你只有“将int添加到int”,“比较float到float”,“乘以无符号和无符号”等指令使得通常的算术转换首先是必要的 – 它们是两种类型到指令的映射家庭,最有意义的使用与他们。 从习惯于编写低级机器代码的人的角度来看,如果你有混合类型,在一般情况下最有可能考虑的汇编指令是那些需要最少转换的指令。对于浮点,情况尤其如此,其中转换是运行时间昂贵的,特别是在20世纪70年代早期,当C开发,计算机速度慢,以及当浮点计算在软件中完成时。这显示在通常的算术转换中 – 只有一个操作数被转换(除了long / unsigned int,其中long可以转换为unsigned long,这不需要在大多数机器上做任何事情,也许不是对任何异常适用的地方)。 所以,通常的算术转换被编写为做一个组合编码器在大多数时候做:你有两个类型不适合,将一个转换到另一个,因此它。这是你在汇编代码中做的,除非你有特殊的原因,否则,以及那些谁习惯编写汇编代码,并有特定的理由强制一个不同的转换,明确要求转换是自然的。毕竟,你可以简单地写

if((double) i < (double) f)

顺便说一句,顺便提一下,在这个上下文中,无序符号在层次结构中比int更高,因此int比较与unsigned将在无符号比较中结束(因此0u <-1比特从开始)。我怀疑这是一个指标,人们在老年代认为无符号少作为一个限制int比作为其价值范围的扩展:我们现在不需要符号,所以让我们使用额外的位为更大的值范围。你会使用它,如果你有理由期望一个int将溢出 - 一个更大的担心在一个16位的int的世界。

转载注明原文:为什么C在float不能表示所有int值时将int提升为float? - 代码日志