2009-06-10 8 views
2

Ich habe einige alte Erinnerungen an C-Code zu schreiben wie:Sind Long-Suffix und Unsigned-Suffix erforderlich, wenn lange Literale in C++ deklariert werden?

long value = 0; 

in den schlechten alten Win16 Tage und enden mit value nur halb initialisiert wird: dh die unteren 16 Bits waren 0 und die oberen 16 Bits waren was auch immer zufällige Bits an diesem Ort im Speicher waren.

long value = 0L; 

Ist dies erforderlich noch in diesem Tag und Alter unter C99 und/oder C++: schreiben als solche wurde ich konditioniert? Ich weiß, dass ILP32 spezifiziert, dass int und long beide 32-Bit sind, aber angenommen, wir verwenden, sagen wir, LP64 wo int s sind 32-Bit und long s sind 64-Bit. Sind die Suffixe erforderlich oder werden die modernen Formen von C und C++ Literale implizit auf die Länge der Variablen erweitern, der sie zugewiesen sind?

Wie wäre es mit vorzeichenlosen Werten? I.e. ist das erforderlich?

unsigned long value = 0UL; 
+0

Mögliche Duplikate von [was ist der Grund für die explizite Deklaration von L oder UL für lange Werte] (https://stackoverflow.com/questions/13134956/what-is-the-reason-for-explicitly-declaring-l- Oder-ul-for-long-Werte) –

Antwort

7

Sie sind in den von Ihnen angegebenen Beispielen nicht erforderlich. Sie können jedoch in einigen etwas verborgenen Umständen benötigt werden. Zum Beispiel können folgende Werte unterschiedliche Werte ergeben:

sizeof(1) 
sizeof(1L) 
+0

Ein einfaches Nein hätte getan. –

+5

@Martin: wirklich? Auf einer solchen Website, die versucht, ihre Leser zu erziehen, bedarf schon eine einfache Ja/Nein-Frage einer Erklärung. –

+0

Beispiele mit 32-Bit gcc -std = c99: sizeof (1) == 4, aber sizeof (1LL) == 8 – Pete

3

Nein, dies sollte nicht mehr benötigt werden. Das Verhalten, das Sie beschreiben, ist, wenn es im Programm und nicht nur im Debugger sichtbar ist, ein Fehler.

1

Da Sie ein 32-Bit-Compiler vorausgesetzt, können Sie nicht L benötigen, wie Sie tat, als ein 16-Bit-Compiler, aber man konnte LL benötigen, zB:

long long ll; 
ll = 1<<32; 

gcc -std = c99 warnt "links shift count> = Breite des Typs." Stattdessen würden Sie wollen:

ll = 1LL<<32; 

Siehe auch https://stackoverflow.com/a/8108658/782738, für C++ 11 und C99 Standardreferenzen.

1

Aber diese Notation wird für wchar_t Strings erforderlich, wie

L"I am a wchar_t string." 

und für lange lange ganze Zahlen, auch ...

Ich denke, das ist etwas, das entfernt werden soll, ist es nicht sinnvoll (Der Typ wird mit seinem Namen und nicht mit einem Suffix deklariert), wird aber immer noch in C++ 11 unterstützt.

Hm.

Verwandte Themen