【问题标题】:How do I specify an integer literal of type unsigned char in C++?如何在 C++ 中指定 unsigned char 类型的整数文字?
【发布时间】:2011-01-19 06:29:01
【问题描述】:

我可以指定一个 unsigned long 类型的整数文字,如下所示:

const unsigned long example = 9UL;

对于 unsigned char 我该如何处理?

const unsigned char example = 9U?;

这是避免编译器警告所必需的:

unsigned char example2 = 0;
...
min(9U?, example2);

我希望避免我目前拥有的冗长解决方法,并且在调用 min 的行中不会出现“unsigned char”,而无需在单独的行上的变量中声明 9:

min(static_cast<unsigned char>(9), example2);

【问题讨论】:

  • 我把你的问题稍微改成了我认为你的意图。 10 之类的东西在 C++ 中称为“文字”(而在 C 中称为“常量”)。这对 C++ 人来说更常见,并且避免与“示例”的声明混淆。
  • TL;DR: 最容易使用和阅读:char(9)uchar(9)
  • @Andrew uchar?
  • @李斯特先生土豆?

标签: c++ integer constants language-lawyer


【解决方案1】:

C++11 引入了用户定义的文字。可以这样使用:

inline constexpr unsigned char operator "" _uchar( unsigned long long arg ) noexcept
{
    return static_cast< unsigned char >( arg );
}

unsigned char answer()
{
    return 42;
}

int main()
{
    std::cout << std::min( 42, answer() );        // Compile time error!
    std::cout << std::min( 42_uchar, answer() );  // OK
}

【讨论】:

  • OP,让这个答案已经被接受!虽然我建议只使用_uc,但为了简洁以及与标准ul 等价。
【解决方案2】:

C 没有提供标准方法来指定宽度小于int 类型的整数常量。

但是,stdint.h 确实提供了 UINT8_C() 宏来执行与您在 C 中所要查找的内容非常接近的内容。

但大多数人要么不使用后缀(获得int 常量),要么使用U 后缀(获得unsigned int 常量)。它们适用于 char 大小的值,这几乎就是您从 stdint.h 宏中获得的全部内容。

【讨论】:

  • 从 glibc 2.26 开始,UINT8_C 不提供 8 位整数:# define UINT8_C(c) c
【解决方案3】:

你可以转换常量。例如:

min(static_cast<unsigned char>(9), example2);

你也可以使用构造函数语法:

typedef unsigned char uchar;
min(uchar(9), example2);

并非所有编译器都需要 typedef。

【讨论】:

  • 我认为你是唯一正确解密他的秘密问题的人。首先,我也不知道他到底想问什么。
  • 对,这是我目前的工作,有这个问题我希望避免演员表,但听起来答案是没有文字可以让我避免演员表。跨度>
  • 使用构造函数语法,这是否会导致每次都分配对象而不是文字?
  • @RaviNankani 这是原始类型的构造函数语法,所以应该没有开销。
  • 我会写这样的东西(因为 uint8_t typedef 自 C++11 以来一直是标准的一部分):min(uint8_t{9}, example2);
【解决方案4】:

如果您使用 Visual C++ 并且不需要编译器之间的互操作性,则可以在数字上使用 ui8 后缀,使其成为无符号的 8 位常量。

min(9ui8, example2);

你不能用像 '9' 这样的实际 char 常量来做到这一点。

【讨论】:

    【解决方案5】:

    假设您正在使用std::min,您实际应该做的是明确指定min 应该使用的类型

    unsigned char example2 = 0;
    min<unsigned char>(9, example2);
    

    【讨论】:

      【解决方案6】:

      只需const unsigned char example = 0; 就可以了。

      【讨论】:

      • 这是一个 int 文字,隐式转换为无符号字符 (const),不是吗?
      【解决方案7】:

      我想'\0' 将是一个值为 0 的字符字面量,但我也看不出重点。

      【讨论】:

      • 这不是无符号字符,而是有符号字符。
      • @WilliamKF:C++ 中'\0' 的类型既不是signed char 也不是unsigned char,正如Axel 所说,它是charchar 与其他整数类型不同:signed intint 是同一类型,但 signed charchar 不是。
      • 我认为char 隐含地与signed char 相同,但我可能在想C...
      • @ScottSmith,这在 C 中是一样的,也是三种不同的类型。如果char 有符号或无符号,则定义它的实现。
      【解决方案8】:

      无符号字符类型没有后缀。整数常量为intlongsignedunsigned),在C99 中为long long。只要值在无符号字符的有效范围内,您就可以放心使用普通的“U”后缀。

      【讨论】:

        【解决方案9】:

        问题是如何“在 C++ 中指定一个 unsigned char 类型的整数‘文字’?”。不是如何声明标识符。

        您在撇号中使用转义反斜杠和八进制数字。 (例如'\177')

        八进制值总是被认为是无符号的。

        【讨论】:

        • 不,它没有被认为是未签名的,它仍然是char——既不是unsigned char也不是signed char
        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 2017-09-04
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 2013-10-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多