C ++ 0和0.0之间的差异(C++ difference between 0 and 0.0)

2019-07-05 01:56发布

有在C ++ 0和0.0之间的差? 你应该使用哪一种初始化双?

谢谢

Answer 1:

一个文字0被认为是一个int字面; 字面0.0是一个double字面值。 当分配给一个double ,无论是将工作(由于int可以在扩大转换浇铸); 然而,铸造0.0int是收缩转换,并且必须被明确地进行; 即(int)0.0



Answer 2:

我尽量保持我的常量类型一致。 0整数。 0.0F或0.f浮法,以及用于双0.0。

对我来说,要做到这一点最重要的原因是为了让编译器和程序员看到同样的事情。

如果我这样做...

float t=0.5f;
float r;

r= 1 * t;

... r应该分配0或0.5? 有没有犹豫,如果我这样做,而不是...

float t=0.5f;
float r;

r= 1.0f * t;


Answer 3:

一个似乎是字面的整数,其他浮点文字。 这真的是你是否初始化浮点或双精度整数文字不要紧,编译器。 在任何情况下的文字会被编译成一些内部表示。

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



Answer 4:

这里是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

他们生产的相同部件。 视觉-C ++使用的异或的XMM寄存器与it'self的方法。 假如你第一次加载整数0,然后移动它到XMM寄存器它会使用一个额外的指令。 鉴于我们对如何假设0.0可以加载为文字,以及额外的无用的指令负荷加载0-2的整数,然后将它移动到一个浮点寄存器,也不是最优的,因此看起来就像真的没关系因为编译器作者我们必须承担这种优化已经知道了很长的时间,因为它是一种显而易见的。 如果需要100%的便携性,那么它是更便携编写手动使用XOR技术的内联函数。



文章来源: C++ difference between 0 and 0.0
标签: c++ double