猜测您的问题how is double number (e.g. 123.45) stored in a float variable or double variable or long double variable?:如果您将双值(如文字“123.0”)存储到浮点变量中,编译器将 static_cast<float> 该值因此它变成有效的浮点值。
因此,除了可能的编译器警告之外,以下
int main () {
float foo = 123.0;
}
基本一样
int main () {
float foo = static_cast<float>(123.0);
}
如果您想显式声明浮点文字,请使用 f 或 F 后缀:
int main () {
float foo = 123.0f; // alternatively: 123.f, 123.F
}
编辑:来自标准
只是为好奇的人查找了浮动文字的语法:
floating-literal:
fractional-constant exponent-part_opt floating-suffix_opt
digit-sequence exponent-part floating-suffix_opt
fractional-constant:
digit-sequence_opt . digit-sequence
digit-sequence .
exponent-part:
e sign_opt digit-sequence
E sign_opt digit-sequence
这里有一些不需要转换(但可能是四舍五入)的浮点字面量示例:
float a = 1.f,
b = 1.0f,
c = .0f,
d = 1e1f,
e = 1.e1f,
f = 1e-1f,
g = 1e+1f,
h = 1E+1F;
如果需要转换,例如
float a = 1., // double
b = 1.L,// long double
c = 1; // integer
以下适用:
4.8 浮点转换 [conv.double]
浮点类型的右值可以转换为另一种浮点类型的右值。如果源
value 可以在目标类型中精确表示,转换的结果就是那个精确的表示。
如果源值介于两个相邻的目标值之间,则转换结果为
这些值中的任何一个的实现定义的选择。否则,行为未定义。
4.9 浮点积分转换_ [conv.fpint]:
整数类型或枚举类型的右值可以转换为浮点类型的右值。如果可能,结果是准确的。整数类型或枚举类型的右值可以转换为浮点的右值
类型。如果可能,结果是准确的。否则,它是下一个实现定义的选择
更低或更高的可表示值。
总而言之,如果您将double 或long double(或某个整数)类型的文字放入float,编译器将隐式转换该值,如果它可以被精确转换的话。否则,结果的存储方式取决于平台;如果值超出可表示的范围,您将进入未定义行为的世界*。
* 未定义行为的可怕领域,邪恶的编译器编写者可能会觉得通过扬声器发出地狱般的声音并让你流血,但仍然受到标准(但不一定符合当地法律)。