C 浮点转换的假设:(int)(float)n==n

C 浮点转换的假设:(int)(float)n==n,c,ieee-754,floating-point-conversion,C,Ieee 754,Floating Point Conversion,对于任何intn,我可以假设(int)(float)n==n?至少对于非负的31位值我需要这个 补遗。关于(int)(double)n==n?不,你不能。对于不能用float精确表示的ints,此操作将失败 (原因:float通常是一个32位IEEE-754浮点值。它只有24位精度,其余的保留给指数和符号。因此,如果整数的有效二进制位数大于23位,并且不是2的适当幂的倍数,那么它就不能精确地表示为整数。)float) 补遗,(int)(double)n==n呢 这是一样的。对于不能表示为doub

对于任何
intn
,我可以假设
(int)(float)n==n
?至少对于非负的31位值我需要这个


补遗。关于
(int)(double)n==n

不,你不能。对于不能用
float
精确表示的
int
s,此操作将失败

(原因:
float
通常是一个32位IEEE-754浮点值。它只有24位精度,其余的保留给指数和符号。因此,如果整数的有效二进制位数大于23位,并且不是2的适当幂的倍数,那么它就不能精确地表示为整数。)
float

补遗,(int)(double)n==n呢

这是一样的。对于不能表示为
double
int
s,比较结果并不总是正确的。但是,一般来说,
int
的长度不足以实现这一点-
double
的广泛接受的实现是一个64位的IEEE-754浮点数,具有53位的精度,其中s
int
s的长度通常最多为32位。但您可以尝试使用
long
long
双精度
重复该实验

下面是一个演示:

#include <stdio.h>

int main()
{
    int n = (1 << 24) + 1;

    printf("n == n: %d\n" , n == n);
    printf("n == (int)(float)n: %d\n", n == (int)(float)n);

    return 0;
}

如果n已经是int,为什么要强制转换?我的int会进入一个浮点数组进行计算。我建议你试试这个程序:@haccks为什么不编译?非常密切相关的问题:我很好奇;哪些int不能表示为浮点?那些超出范围?@MitchWheat:例如,2^24+1.@Devolus你怎么做它不会进行转换?这s不是可以优化掉的不变转换。编译器必须这样做。@EmanuelePaolini:请记住IEEE-754浮点值有一个隐式的前导二进制1。所以它是2^24+1以下的所有值。@OliCharlesworth:C标准要求强制转换和赋值将值转换为标称类型;多余的精度必须为elimina特德。
n == n: 1
n == (int)(float)n: 0