2008-10-16 22 views
93

非常基本的問題:我如何在C++中編寫short文字?如何在C++中編寫簡短的文字?

我瞭解以下內容:

  • 2int
  • 2Uunsigned int
  • 2Llong
  • 2LLlong long
  • 2.0ffloat
  • 2.0double
  • '\2'char

但是,我會怎麼寫一個short文字?我試過2S,但是這給了編譯器警告。

+7

我猜短文字是不支持的,因爲在評估過程中,小於int的任何東西都會被「提升」爲int。 int具有最自然的大小。這在C++中被稱爲整數提升。 – user534498 2011-02-16 05:49:35

回答

66
((short)2) 

呀,這不是嚴格意義上的短文字,更多的是鑄造-INT的,但行爲是一樣的,我覺得沒有這樣做的一個直接的方式。

這就是我一直在做的事情,因爲我找不到任何關於它的事情。我猜想編譯器可以很聰明地編譯它,就好像它是一個簡短的文字(即它實際上不會分配一個int然後每次都投它)。

以下說明多少,你應該擔心這一點:

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

編譯 - >拆解 - >

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

這就是我一直在做的事情,因爲我找不到任何關於它的事情。我猜想編譯器可以很聰明地編譯它,就好像它是一個簡短的文字(即它實際上不會分配一個int然後每次都投它)。 – Kip 2008-10-16 13:25:41

+0

「演員」並沒有真正做任何事情。當我們談論C或C++時,沒有「cast」彙編指令(儘管.NET MSIL是一個不同的故事)。在金屬上,這只是二進制數字 – 2008-10-16 13:47:48

+9

上面的a,b,c和d的類型是什麼? – 2008-10-16 16:30:12

5

據我所知,你沒有,沒有這樣的後綴。不過,大多數編譯器會警告,如果整數文字太大,無法放入任何你想存儲的變量。

27

即使是C99標準的作家得到了由該抓了出來。這是丹尼·史密斯的公共領域stdint.h實現一個片段:

/* 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讓你很接近你想要什麼。 (搜索「用戶自定義文本」,以瞭解更多信息。)

#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); 
} 
6

您還可以使用僞構造函數語法。

short(2) 

我發現它比鑄造更可讀。

12

如果您使用Microsoft Visual C++,也有適用於所有整型常量後綴:

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 

注意,這些都是非標準擴展不是便攜式的。事實上,我甚至無法在MSDN上找到這些後綴的任何信息。

相關問題