C ++在0和0.0之间的差异

时间:2009-09-05 22:44:21

标签: c++ double

C ++中0和0.0之间有区别吗?您应该使用哪个来初始化双倍?

由于

4 个答案:

答案 0 :(得分:15)

文字0被视为int字面值;文字0.0double字面值。分配到double时,两者都可以使用(因为int可以在扩展转换中投射);但是,将0.0投射到int是一个缩小的转换,必须明确地完成;即(int)0.0

答案 1 :(得分:10)

我试着保持我的常量类型一致。 0表示整数。浮点数为0.0f或0.f,双精度为0.0。

对我而言,执行此操作的最重要原因是编译器和程序员看到同样的事情。

如果我这样做......

float t=0.5f;
float r;

r= 1 * t;

...应该分配0或.5?如果我这样做,毫不犹豫......

float t=0.5f;
float r;

r= 1.0f * t;

答案 2 :(得分:5)

一个似乎是整数文字,另一个是浮点文字。对于编译器来说,使用整数文字初始化浮点数还是双精度数并不重要。无论如何,文字将被编译成一些内部表示。

我倾向于建议0.0,以使你的意图(对其他程序员)明确清楚。

答案 3 :(得分:1)

以下是Visual-C ++的反汇编:

int main() {
  double x = 0;
  //
  double y = 0.0;
  //
  double z = x * y;
  return 0;
}

反汇编

int main() {
00007FF758A32230  push        rbp  
00007FF758A32232  push        rdi  
00007FF758A32233  sub         rsp,128h  
00007FF758A3223A  mov         rbp,rsp  
00007FF758A3223D  mov         rdi,rsp  
00007FF758A32240  mov         ecx,4Ah  
00007FF758A32245  mov         eax,0CCCCCCCCh  
00007FF758A3224A  rep stos    dword ptr [rdi]  
  double x = 0;
00007FF758A3224C  xorps       xmm0,xmm0  
00007FF758A3224F  movsd       mmword ptr [x],xmm0  
  //
  double y = 0.0;
00007FF758A32254  xorps       xmm0,xmm0  
00007FF758A32257  movsd       mmword ptr [y],xmm0  
  //
  double z = x * y;
00007FF758A3225C  movsd       xmm0,mmword ptr [x]  
00007FF758A32261  mulsd       xmm0,mmword ptr [y]  
00007FF758A32266  movsd       mmword ptr [z],xmm0  
  return 0;
00007FF758A3226B  xor         eax,eax  
}
00007FF758A3226D  lea         rsp,[rbp+128h]  
00007FF758A32274  pop         rdi  
00007FF758A32275  pop         rbp  
00007FF758A32276  ret

他们生产了相同的组件。 Visual C ++使用对XMM寄存器自身进行XOR运算的方法。如果您首先加载了整数0,然后将其移至XMM寄存器,则会使用一条额外的指令。假设我们假设如何将0.0当作字面量以及额外的无用指令加载,先加载整数0然后将其移动到浮点寄存器中,这都不是最佳选择,因此看起来好像真的没关系,因为编译器作者必须假定这种优化已经很久了,因为它很明显。如果需要100%的可移植性,那么编写手动使用XOR技术的内联函数将更容易移植。