非常基本的問題:我如何在C++中編寫short
文字?如何在C++中編寫簡短的文字?
我瞭解以下內容:
2
是int
2U
是unsigned int
2L
是long
2LL
是long long
2.0f
是float
2.0
是double
'\2'
是char
。
但是,我會怎麼寫一個short
文字?我試過2S
,但是這給了編譯器警告。
非常基本的問題:我如何在C++中編寫short
文字?如何在C++中編寫簡短的文字?
我瞭解以下內容:
2
是int
2U
是unsigned int
2L
是long
2LL
是long long
2.0f
是float
2.0
是double
'\2'
是char
。但是,我會怎麼寫一個short
文字?我試過2S
,但是這給了編譯器警告。
((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
這就是我一直在做的事情,因爲我找不到任何關於它的事情。我猜想編譯器可以很聰明地編譯它,就好像它是一個簡短的文字(即它實際上不會分配一個int然後每次都投它)。 – Kip 2008-10-16 13:25:41
「演員」並沒有真正做任何事情。當我們談論C或C++時,沒有「cast」彙編指令(儘管.NET MSIL是一個不同的故事)。在金屬上,這只是二進制數字 – 2008-10-16 13:47:48
上面的a,b,c和d的類型是什麼? – 2008-10-16 16:30:12
據我所知,你沒有,沒有這樣的後綴。不過,大多數編譯器會警告,如果整數文字太大,無法放入任何你想存儲的變量。
即使是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."
*/
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);
}
您還可以使用僞構造函數語法。
short(2)
我發現它比鑄造更可讀。
如果您使用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上找到這些後綴的任何信息。
我猜短文字是不支持的,因爲在評估過程中,小於int的任何東西都會被「提升」爲int。 int具有最自然的大小。這在C++中被稱爲整數提升。 – user534498 2011-02-16 05:49:35