如何在C++中指定unsigned char类型的整数文字?

Wil*_*mKF 46 c++ integer constants language-lawyer

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

const unsigned long example = 9UL;
Run Code Online (Sandbox Code Playgroud)

我如何为无符号字符做同样的事情?

const unsigned char example = 9U?;
Run Code Online (Sandbox Code Playgroud)

这是为了避免编译器警告:

unsigned char example2 = 0;
...
min(9U?, example2);
Run Code Online (Sandbox Code Playgroud)

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

min(static_cast<unsigned char>(9), example2);
Run Code Online (Sandbox Code Playgroud)

小智 41

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
}
Run Code Online (Sandbox Code Playgroud)

  • OP,已经接受了这个答案!虽然我建议只使用`_uc`,为了简洁以及与标准`ul`的奇偶校验等等. (4认同)

Mic*_*urr 28

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

然而,stdint.h确实提供UINT8_C()宏来做一些非常接近你正在寻找的东西,因为你将进入C.

但大多数人只是使用无后缀(获得int常量)或U后缀(获得unsigned int常量).它们可以很好地处理字符大小的值,而且stdint.h无论如何,这几乎都可以从宏中获得.

  • 从 glibc 2.26 开始,UINT8_C 不会给你一个 8 位整数:```#define UINT8_C(c) c``` (3认同)

jan*_*anm 20

你可以施放常数.例如:

min(static_cast<unsigned char>(9), example2);
Run Code Online (Sandbox Code Playgroud)

您还可以使用构造函数语法:

typedef unsigned char uchar;
min(uchar(9), example2);
Run Code Online (Sandbox Code Playgroud)

所有编译器都不需要typedef.

  • 我会写这样的东西(因为自 C++11 以来 **uint8_t** typedef 一直是标准的一部分): `min(uint8_t{9}, example2);` (2认同)

Mr *_*ter 11

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

min(9ui8, example2);
Run Code Online (Sandbox Code Playgroud)

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


E.M*_*.M. 8

假设您正在使用std::min实际应该执行的操作,请明确指定min应使用的类型

unsigned char example2 = 0;
min<unsigned char>(9, example2);
Run Code Online (Sandbox Code Playgroud)