我如何在C++中写一个简短的文字
How do I write a short literal in C++?
非常基本的问题:如何在C++中编写short
文字?
我知道以下几点:
-
2
是一个int
-
2U
是一个unsigned int
-
2L
是一个long
-
2LL
是一个long long
-
2.0f
是一个float
-
2.0
是一个double
-
'2'
是一个char
.
但是我该如何写一个short
字面呢? 我尝试了2S
但这给出了编译器警告。
((short)2)
是的,严格来说,这不是一个简短的文字,更像是一个 casted-int,但行为是相同的,我认为没有直接的方法可以做到这一点。
这就是我一直在做的事情,因为我找不到任何关于它的东西。我猜编译器会足够聪明地编译它,就好像它是一个简短的文字一样(即它实际上不会分配一个 int 然后每次都强制转换它(。
下面说明了您应该对此担心多少:
a = 2L;
b = 2.0;
c = (short)2;
d = '2';
编译 -> 反汇编 ->
movl $2, _a
movl $2, _b
movl $2, _c
movl $2, _d
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);
}
即使是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."
*/
免责声明:出于好奇,我留下了这个答案,但你真的不应该在生产代码中使用它。请改用 UDL 或适当类型的常量。
<小时 />如果使用Microsoft视觉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 上找到有关这些后缀的任何信息。
您还可以使用伪构造函数语法。
short(2)
我发现它比选角更具可读性。
一种可能性是为此目的使用 C++11 "列表初始化",例如:
short{42};
此解决方案的优点(与当前接受的答案中的强制转换相比(是它不允许缩小转换范围:
auto number1 = short(100000); // Oops: Stores -31072, you may get a warning
auto number2 = short{100000}; // Compiler error. Value too large for type short
请参阅 https://en.cppreference.com/w/cpp/language/list_initialization#Narrowing_conversions,了解禁止使用列表初始化进行缩小范围转换的信息
据我所知,你没有,没有这样的后缀。但是,大多数编译器会警告整数文本是否太大而无法容纳您尝试存储它的任何变量。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 为什么要在 c/c++ 中直接写一个文字后跟一个分号?
- 有没有办法,或者需要编写一个通用的模板化字符文字
- 另一个字符串文字,UDL 迷宫
- 如何在yaml-cpp中写一个版本字符串作为文字(不是字符串)
- 可以一个#define一个文字字符串,其中包含用于资源文件的非ANSI字符的字符串
- 字符串文字绑定到一个非常量字符指针
- 当一个函数可以被赋予一个 char* 或文字字符串时,声明这个函数的正确方法是什么?
- 为什么我需要一个类似于复合文字的临时构造来初始化我的std::数组成员
- C++中是否有一个浮点文字后缀来使数字的精度翻倍
- 我们可以分配一个无符号的int变量,0xFULL文字吗
- 定义一个符号,该符号可能是boost精神中文字功能的一部分
- 是一个字符串文字,不能用作C++中的模板参数
- 我怎么能转义字符串,以确保它是一个有效的字符串文字在JS源
- Opencv:创建一个黑色窗口并在上面写文字
- 为什么我可以分配一个长度小于数组本身的字符串文字
- 我如何在C++中写一个简短的文字