我想知道什么时候应该投出更好.在添加,乘法等时,C++中的隐式类型转换规则是什么.例如,
int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?
Run Code Online (Sandbox Code Playgroud)
等等...
表达式是否总是被评估为更精确的类型?Java的规则有所不同吗?如果我不准确地说出这个问题,请纠正我.
我偶然发现了维基百科上的以下示例(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
}
Run Code Online (Sandbox Code Playgroud)
他们的解释是:"这种奇怪的行为是由于i_value与f_value进行比较时隐式转换为浮动;一个失去精度的转换,使得比较的值不同."
这不对吗?如果i_value被转换为浮动,那么两者都会有相同的精度损失并且它们是相等的.所以i_value必须加倍.
我知道在 C 和 Java 中,float 的底层表示是 IEEE754-32,double 是 IEEE754-64。
在表达式中,float将自动提升为double. 又怎样?以 3.7f 为例。过程是这样的吗?
- 3.7f 将使用 IEEE754 在内存中表示。它适合 4 个字节。
- 在计算过程中,它可能被加载到一个64位寄存器(或任何64位的地方),把3.7f变成IEEE754-64表示。