【问题标题】:Specifying unsigned char storage for integer numerals为整数指定无符号字符存储
【发布时间】:2020-09-22 23:03:23
【问题描述】:

就现代 C++ 而言,是否可以指定将整数存储为 char?

我希望写 auto var = 255; 来将 var 初始化为 unsigned char 类型

可以指定其他类型的存储:

auto var_ulong = 255ul;
auto var_float = 255.f;

但是,不是short 还是char?当然我错过了什么......

【问题讨论】:

  • 如果你知道你想要什么类型,你可以声明那个类型。
  • I don't think you are missing anything。你可以施放,但这会破坏使用auto 的意义。也许用户定义的文字会起作用。刚检查。它有效,但它只是一个美化的演员表。
  • short 或 char 没有任何后缀,因为表达式中的所有内容都将提升为 int,因此这些后缀将无用
  • @phuclv 它可以像 OP 想要的那样初始化一个变量。 consteval unsigned char operator"" _uchar(unsigned long long x) { return static_cast<unsigned char>(x); } 然后 auto var_uchar = 255_uchar; 将使 var_uchar 成为 unsigned char
  • 我的简单测试看起来像 constexpr uint8_t operator"" _uc ( unsigned long long int n ) { return static_cast<uint8_t>(n); } 并且在 C++ 17 中工作。也就是说,这是我只是避免 auto 的情况。当我负担得起任何惊喜时,我不会使用auto

标签: c++ literals


【解决方案1】:

没有标准的整数文字来做你想做的事,但如果你打算经常这样做,你可以添加自己的user- defined literal

namespace foo {

// constexpr pre C++20
//  |
//  V 
consteval unsigned char operator"" _uchar(unsigned long long x) {
    return static_cast<unsigned char>(x);
}

}
using namespace foo;
auto var_uchar = 255_uchar;

请注意,正常的整数提升仍然有效,所以在下面,你会得到一个int

auto var_int = 55_uchar + 10_uchar;

【讨论】:

  • 虽然还是比uint8_t var = 255
  • @phuclv uint8_t 是可选类型。它甚至不需要存在。此外,_uchar 部分是用户定义的。如果你想让它尽可能短,你可以让它consteval unsigned char operator""_C(unsigned long long x);(“”和_C之间没有空格)。
  • 我知道用户定义的文字,但 short x = 1char x = 1 仍然比 auto x = 1_sauto x = 1_c
  • @phuclv 我不明白你的意思。我正在回答 OP:s 请求“我希望写 auto var = 255; 以将 var 初始化为 unsigned char 类型...可以指定其他类型的存储:auto var_float = 255.f;unsigned char 没有这样的文字,但是可以制作用户定义的文字并为 OP 询问的特定类型提供示例。它的长度在哪里成为问题?这不是 OP 要求的,我想我已经回答了 OP:s 的问题。不是吗?
猜你喜欢
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2011-06-14
  • 2016-10-27
相关资源
最近更新 更多