如何在C++中编写一个短文本?

ux6nzvsh  于 2023-02-14  发布在  其他
关注(0)|答案(7)|浏览(130)

非常基本的问题:如何在C++中编写short常量?
我知道以下几点:

  • 2是一个int
  • 2U是一个unsigned int
  • 2Llong
  • 2LLlong long
  • 2.0f是一个float
  • 2.0double
  • '\2'是一个char

但是我该如何写一个short常量呢?我试过2S,但是它给出了一个编译器警告。

ryhaxcpt

ryhaxcpt1#

((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
guz6ccqo

guz6ccqo2#

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);
}
v8wbuo2f

v8wbuo2f3#

甚至连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."
*/
p3rjfoxz

p3rjfoxz4#

免责声明:我只是出于好奇才给出这个答案,但是你真的不应该在产品代码中使用它,而应该使用UDL或者适当类型的常量。
如果使用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信息。

ki1q1bka

ki1q1bka5#

也可以使用伪构造函数语法。

short(2)

我觉得这比选角更有可读性。

4uqofj5v

4uqofj5v6#

一种可能性是使用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禁止使用list-init进行收缩转换的信息,请参见www.example.com

mhd8tkvw

mhd8tkvw7#

据我所知,你不知道,没有这样的后缀。大多数编译器会警告,如果一个整型文字太大,以适应任何变量,你试图存储它,虽然。

相关问题