/* 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."
*/
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
auto number1 = short(100000); // Oops: Stores -31072, you may get a warning
auto number2 = short{100000}; // Compiler error. Value too large for type short
7条答案
按热度按时间ryhaxcpt1#
是的,它不是严格意义上的短文字,更像是一个强制整型,但是行为是一样的,我认为没有直接的方法来做。
这就是我一直在做的事情,因为我找不到任何关于它的东西。我猜编译器会足够聪明,把它编译成一个短文本(也就是说,它不会实际上分配一个int型,然后每次都强制转换)。
下面的例子说明了您应该对此有多担心:
编译-〉反汇编-〉
guz6ccqo2#
C++11提供了非常接近你想要的东西。(搜索“用户定义的文本”以了解更多信息。)
v8wbuo2f3#
甚至连C99标准的编写者也被这个问题所困扰。这是Danny Smith的公共领域
stdint.h
实现的一个片段:p3rjfoxz4#
免责声明:我只是出于好奇才给出这个答案,但是你真的不应该在产品代码中使用它,而应该使用UDL或者适当类型的常量。
如果使用Microsoft Visual C++,则每种整数类型都有可用的文本后缀:
请注意,这些是非标准扩展和是不可移植的。事实上,我甚至不能找到任何关于这些后缀的MSDN信息。
ki1q1bka5#
也可以使用伪构造函数语法。
我觉得这比选角更有可读性。
4uqofj5v6#
一种可能性是使用C++11“列表初始化”实现此目的,例如:
这种解决方案的优点(与当前接受的答案中的强制转换相比)是它不允许收缩转换:
有关https://en.cppreference.com/w/cpp/language/list_initialization#Narrowing_conversions禁止使用list-init进行收缩转换的信息,请参见www.example.com
mhd8tkvw7#
据我所知,你不知道,没有这样的后缀。大多数编译器会警告,如果一个整型文字太大,以适应任何变量,你试图存储它,虽然。