将数学常量定义为double值是有意义的,但是当需要浮点值而不是双精度值时会发生什么?编译器是否在编译时自动将双精度解释为浮点数(因此它们实际上被视为const浮点数)或者是在运行时进行的转换?
答案 0 :(得分:2)
如果通过“定义”,您的意思是使用#define
,则会发生以下情况:
说你有:
#define CONST1 1.5
#define CONST2 1.12312455431461363145134614 // Assume some number too
// precise for float
现在,如果你有:
float x = CONST1;
float y = CONST2;
您没有收到x
的任何警告,因为编译器自动使CONST1
成为float
。对于y
,您会收到警告,因为CONST2
不适合float
,但,编译器无论如何都会将其转换为float
。< / p>
如果通过“定义”,您的意思是使用const
变量,那么会发生以下情况:
说你有
const double CONST1=1.5;
const double CONST2=1.12312455431461363145134614; // Assume some number too
// precise for float
现在,如果你有:
float x = CONST1;
float y = CONST2;
编译器无法知道CONST1
和CONST2
(*)的值,因此在编译它们时无法将值解释为float
。您将收到两条关于可能丢失数据的警告,转换将在运行时完成。
(*)其实有一种方法。由于值为const
,优化器可能决定不为它们采用变量,而是替换整个代码中的值。这可能会变得复杂,因为您可以将地址传递给这些变量,因此优化器可能决定不这样做。也就是说,不要指望它。
请注意,对于任何基本类型转换,这一切都是正确的。如果你有
#define CONST3 1
然后你认为CONST3
是int
,但如果你把它放在float
中,它会在编译时成为float
,或者如果你把它放入char
,在编译时会变为char
。