2008-10-16 11 views
93

Sehr grundlegende Frage: Wie schreibe ich ein short Literal in C++?Wie schreibe ich ein kurzes Literal in C++?

ich folgendes wissen:

  • 2 ist ein int
  • 2U ist ein unsigned int
  • 2L ist ein long
  • 2LL ist ein long long
  • 2.0f ist ein float
  • 2.0 ist ein double
  • '\2' ein char ist.

Aber wie würde ich ein short Literal schreiben? Ich versuchte 2S, aber das gibt eine Compiler-Warnung.

+7

Ich denke, kurze Literal wird nicht allein aufgrund der Tatsache unterstützt, dass alles weniger als int bei der Auswertung in Int "gefördert" wird. int hat die natürlichste Größe. Dies wird als Integer-Promotion in C++ bezeichnet. – user534498

Antwort

66
((short)2) 

Ja, es ist nicht unbedingt eine kurze wörtliche, eher ein gegossenem-int, aber das Verhalten ist das gleiche, und ich denke, es zu tun, es ist kein direkter Weg ist.

Das habe ich gemacht, weil ich nichts darüber finden konnte. Ich würde vermuten, dass der Compiler klug genug wäre, dies zu kompilieren, als ob es ein kurzes Literal wäre (d. H. Es würde tatsächlich keinen int zuweisen und es dann jedes Mal umwandeln).

Die folgende Abbildung zeigt, wie viel sollte man sich Gedanken zu machen:

a = 2L; 
b = 2.0; 
c = (short)2; 
d = '\2'; 

Compile -> zerlegen ->

movl $2, _a 
movl $2, _b 
movl $2, _c 
movl $2, _d 
+0

Das habe ich gemacht, weil ich nichts darüber finden konnte. Ich würde vermuten, dass der Compiler klug genug wäre, dies zu kompilieren, als ob es ein kurzes Literal wäre (d. H. Es würde tatsächlich keinen int zuweisen und es dann jedes Mal umwandeln). – Kip

+0

Die "Besetzung" macht gar nichts. Es gibt keine "Cast" Assembler-Anweisung, wenn wir C oder C++ sprechen (.NET MSIL ist jedoch eine andere Geschichte). Dort auf dem Metall, es ist alles nur Binärziffern –

+9

Was sind die Arten von a, b, c und d oben? –

5

Soweit ich weiß, Sie nicht, es gibt keine solche Suffix. Die meisten Compiler warnen, wenn ein Integer-Literal zu groß ist, um in die Variable zu passen, in der Sie es speichern möchten.

27

Selbst die Autoren der C99-Standard wurde durch diese gefangen. Dies ist ein Ausschnitt aus Danny Smith public domain stdint.h Umsetzung:

/* 7.18.4.1 Macros for minimum-width integer constants 

    Accoding to Douglas Gwyn <[email protected]>: 
    "This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC 
    9899:1999 as initially published, the expansion was required 
    to be an integer constant of precisely matching type, which 
    is impossible to accomplish for the shorter types on most 
    platforms, because C99 provides no standard way to designate 
    an integer constant with width less than that of type int. 
    TC1 changed this to require just an integer constant 
    *expression* with *promoted* type." 
*/ 
41

C++ 11 gibt Ihnen ziemlich nah an, was Sie wollen. (Suche nach "benutzerdefinierten Literale" mehr erfahren.)

#include <cstdint> 

inline std::uint16_t operator "" _u(unsigned long long value) 
{ 
    return static_cast<std::uint16_t>(value); 
} 

void func(std::uint32_t value); // 1 
void func(std::uint16_t value); // 2 

func(0x1234U); // calls 1 
func(0x1234_u); // calls 2 

// also 
inline std::int16_t operator "" _s(unsigned long long value) 
{ 
    return static_cast<std::int16_t>(value); 
} 
+3

'short' physisch kann kein' std :: uint'etwas sein, da es sich um einen signierten Typ handelt. Und es ist nicht erforderlich, dass es entweder 16 Bits oder der gleiche Typ wie ein 'std :: int16_t' ... ist, der selbst nicht _exist_ in einer bestimmten Implementierung sein muss, wenn die Plattform den exakten Typ der Breite nicht liefern kann. Die Kernidee dieser Antwort ist gut, aber sie wird durch die unerklärbare Tangenz in nicht verwandte Typen abgewertet, nach denen das OP nicht gefragt hat. –

+0

Hinweis: Benutzerdefinierte Literale werden in Visual Studio erst ab Version VS2015 unterstützt: https://msdn.microsoft.com/en-us/library/hh567368(v=vs.140).aspx – parsley72

6

Sie auch Pseudo-Konstruktor Syntax verwenden können.

short(2) 

Ich finde es besser lesbar als Gießen.

+1

es wird als "funktionaler Ausdruck" bezeichnet . Ich mag es auch sehr, besonders beim Programmieren mit der Windows API. –

12

Wenn Sie Microsoft Visual C++ gibt es wörtliche Suffixe für jeden Integer-Typen zur Verfügung:

auto var1 = 10i8; // char 
auto var2 = 10ui8; // unsigned char 

auto var3 = 10i16; // short 
auto var4 = 10ui16; // unsigned short 

auto var5 = 10i32; // int 
auto var6 = 10ui32; // unsigned int 

auto var7 = 10i64; // long long 
auto var8 = 10ui64; // unsigned long long 

Beachten Sie, dass diese Nicht-Standard-Erweiterungen und sind nicht tragbar. Tatsächlich konnte ich keine Informationen zu diesen Suffixen auf MSDN finden.

+1

Wenn Sie eines der Suffixe nachzeichnen, sehen Sie, dass z. "" ui8 "ist definiert als" 000 ", was im Wesentlichen" \ "bedeutet. – Nikita

Verwandte Themen