Answers:
((short)2)
是的,严格来说,这不是一个简短的字面量,更多的是强制转换,但是行为是相同的,我认为没有直接的方法。
那就是我一直在做的事情,因为我找不到任何东西。我猜想编译器会足够聪明,就好像它是一个短文字一样进行编译(即实际上不会分配一个int然后每次都强制转换它)。
下面说明了您应该为此担心多少:
a = 2L;
b = 2.0;
c = (short)2;
d = '\2';
编译->反汇编->
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _d
short foo = 1; foo += (short)2;
。但这不能因整数提升而被规避。
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
物理上不能是std::uint
任何东西,因为它是带符号的类型。而且,它不需要是16位或与...相同的类型,如果平台无法提供精确宽度的类型std::int16_t
,则它本身甚至不需要存在于给定的实现中。这个答案的核心思想是好的,但是它被OP没问到的无关类型的莫名其妙的切线所贬低。
short
OP 的修改后。
甚至C99标准的编写者都被这一点所吸引。这是Danny Smith的公共领域stdint.h
实现的摘录:
/* 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."
*/
如果使用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上都找不到这些后缀的任何信息。
""ui8
定义为'\000'
,本质上是'\0'
。
您还可以使用伪构造函数语法。
short(2)
我发现它比强制转换更具可读性。