C++ Unterschied zwischen 0 und 0.0

Lesezeit: 4 Minuten

Gibt es einen Unterschied zwischen 0 und 0.0 in C++? Was sollten Sie zum Initialisieren eines Doubles verwenden?

Vielen Dank

Ein Wort 0 gilt als ein int wörtlich; wörtlich 0.0 ist ein double wörtlich. Bei der Zuordnung zu a doublebeide funktionieren (da die int kann in eine Verbreiterungsumwandlung gegossen werden); jedoch Gießen 0.0 zu einem int ist eine einschränkende Konvertierung und muss explizit durchgeführt werden; dh (int)0.0.

  • und 0.0f ist ein Gleitkommawert. 😀

    – Gordon Gustafson

    6. September 2009 um 0:32 Uhr

  • @Rob, sagst du, dass ein Double nicht implizit in ein Int konvertiert werden kann? In Betracht ziehen int a = 0.0;.

    – Johannes Schaub – litb

    6. September 2009 um 1:05 Uhr

  • Ein Double kann mit Sicherheit einem Int ohne expliziten Cast zugewiesen werden. Dieser Teil der Antwort muss überarbeitet werden.

    – Brian Neal

    6. September 2009 um 14:59 Uhr

  • Vielleicht bedeutet Rob “muss” im Sinne von “um Warnungen bei zu vermeiden”? Im Fall einer Konstante, die eindeutig in einem Int darstellbar ist, erscheint das übertrieben. Aber im Allgemeinen ist die Konvertierung von double in int gefährlich, da sie für große Werte undefiniert ist, daher stimme ich der Verallgemeinerung zu, dass Konvertierungen eingeschränkt werden sollte explizit sein.

    – Steve Jessop

    6. September 2009 um 16:12 Uhr

  • Ich denke, 0 bis 0,0 Casting erfolgt in der Kompilierzeit. Habe ich recht?

    – Danke

    17. Juni 2015 um 11:01 Uhr

Benutzer-Avatar
Nosredna

Ich versuche, meine Konstanten typkonsistent zu halten. 0 für int. 0.0f oder 0.f für Float und 0.0 für Double.

Für mich ist der wichtigste Grund, dies zu tun, damit der Compiler und der Programmierer dasselbe sehen.

Wenn ich das mache…

float t=0.5f;
float r;

r= 1 * t;

…sollte r 0 oder .5 zugewiesen werden? Es gibt kein Zögern, wenn ich das stattdessen tue …

float t=0.5f;
float r;

r= 1.0f * t;

  • Ja, C ist in Schwierigkeiten, wenn es jemals Gleitkomma-Hex-Literale unterstützen will, nicht wahr? 🙂

    – Nosredna

    6. September 2009 um 4:49 Uhr

  • Können Sie das bitte erläutern? warum sollte r jemals 0 zugewiesen werden?

    – pingu

    2. Juli 2012 um 15:42 Uhr

  • im ersten Fall ist der Wert 1 eine Ganzzahl und wird vor der Multiplikation heraufgestuft.

    – EvilTeach

    31. Juli 2018 um 16:15 Uhr

Das eine scheint ein Integer-Literal zu sein, das andere ein Fließkomma-Literal. Für den Compiler spielt es keine Rolle, ob Sie Floats oder Doubles mit Integer-Literalen initialisieren. In jedem Fall wird das Literal zu einer internen Darstellung kompiliert.

Ich würde eher 0.0 vorschlagen, um Ihre Absicht (für andere Programmierer) deutlich zu machen.

  • Tatsächlich kann dies eine Rolle spielen, da der Compiler anstelle des Ladens von 0, was eine Einzelzyklusanweisung ist, möglicherweise eine Null aus dem ROM lädt. Wenn das gesagt ist, wäre das irgendwie albern, aber andererseits sind wir Affen.

    Benutzer2356685

    31. Juli 2018 um 15:39 Uhr

Hier ist die Visual-C++-Disassemblierung für:

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

Demontage

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

Sie produzierten die gleiche Baugruppe. Visual-C++ verwendet die Methode der XOR-Verknüpfung des XMM-Registers mit sich selbst. Hätten Sie zuerst die Ganzzahl 0 geladen und sie dann in das XMM-Register verschoben, wäre eine zusätzliche Anweisung verwendet worden. Angesichts unserer Hypothese darüber, wie die 0.0 kann als Literal geladen werden, ebenso wie die zusätzliche nutzlose Befehlsladung, die eine ganze Zahl 0 lädt und sie dann in ein Gleitkommaregister verschiebt, beides ist nicht optimal, also scheint es, als ob es wirklich keine Rolle spielt, weil der Compiler-Writer wir annehmen müssen Diese Optimierung ist seit langem bekannt, weil sie irgendwie offensichtlich ist. Wenn eine 100-prozentige Portabilität erforderlich ist, ist es besser, eine Inline-Funktion zu schreiben, die die XOR-Technik manuell verwendet.

1015830cookie-checkC++ Unterschied zwischen 0 und 0.0

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy