有人能解释一下原因吗:
double d = 1.0e+300;
printf("%dn", d == 1.0e+300);
在64位计算机上按预期打印"1",但在32位计算机上打印"0"?(我在Fedora 25上使用GCC 6.3得到了这个)
据我所知,浮点文字的类型是double
,并且没有发生类型转换。
更新:只有在使用-std=c99
标志时才会发生这种情况。
C标准允许在某些表达式中将浮点常量静默地传播到long double
精度(注意:精度,而不是类型)。对应的宏是FLT_EVAL_METHOD
,自C99以来在<float.h>
中定义。
根据C11(N1570)§5.2.4.2.2,值2
的语义为:
评估所有运算和常量的范围和精度CCD_ 7型。
从技术角度来看,在x86体系结构(32位)上,GCC使用带有80位堆栈寄存器的x87将给定代码编译为FPU指令,而对于x86-64体系结构(64位),它优先提供SSE单元(作为XMM寄存器中的标量)。
当前的实现与-fexcess-precision=standard
选项一起在GCC 4.5中介绍。来自GCC 4.5发行说明:
GCC现在支持处理由以符合ISO C99的方式使用x87浮点单元。这是通过
-fexcess-precision=standard
和标准启用的一致性选项,如-std=c99
,并且可以使用CCD_ 11。