Frage

Sehr einfache Frage: Wie schreibe ich ein short wörtliche in C ++

Ich weiß, wie folgt vor:

  • 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' ist ein char.

Aber wie würde ich schreibe ein short wörtliche? Ich habe versucht, 2S aber das gibt eine Compiler-Warnung.

War es hilfreich?

Lösung

((short)2)

Ja, es ist nicht unbedingt eine kurze wörtliche, eher ein gegossenem-int, aber das Verhalten ist das gleiche, und ich glaube, es gibt keine direkte Art und Weise tun.

  

Das ist, was ich getan habe, weil ich nichts darüber gefunden. Ich würde vermuten, dass der Compiler intelligent genug sein würde, dies zu kompilieren, als ob es sich um eine kurze wörtliche ist (das heißt, es wäre nicht wirklich ein int zuweisen und sie dann jedes Mal cast).

Das folgende Beispiel zeigt, wie viel sollten Sie diese Sorge:

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

Übersetzen -> auseinanderbauen ->

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

Andere Tipps

C ++ 11 gibt Ihnen ziemlich nah an, was Sie wollen. (Suche nach "benutzerdefinierter Literale" um mehr zu 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);
}

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

/* 7.18.4.1  Macros for minimum-width integer constants

    Accoding to Douglas Gwyn <gwyn@arl.mil>:
    "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."
*/

Wenn Sie Microsoft Visual C ++ verwenden, gibt es wörtliche Suffixe für jeden Integer-Typ:

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
Hinweis

, dass diese Nicht-Standard-Erweiterungen und ist nicht tragbar . In der Tat konnte ich nicht einmal Informationen über diese Suffixe auf MSDN finden.

Sie können auch Pseudo-Konstruktor Syntax verwenden.

short(2)

Ich finde es besser lesbar als Gießen.

Soweit ich weiß, Sie dies nicht tun, dann ist es kein solches Suffix. Die meisten Compiler warnt, wenn ein Ganzzahlliteral zu groß ist, um zu passen, was Variable Sie versuchen, es in zu speichern, though.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top