68

我可以指定一个 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);
4

9 回答 9

61

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
}
于 2016-04-25T08:57:00.933 回答
30

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

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

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

于 2010-02-21T07:12:50.490 回答
24

您可以转换常量。例如:

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

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

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

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

于 2010-02-21T08:32:03.230 回答
16

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

min(9ui8, example2);

但是,您不能使用像 '9' 这样的实际 char 常量来执行此操作。

于 2011-12-02T10:09:59.260 回答
10

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

unsigned char example2 = 0;
min<unsigned char>(9, example2);
于 2010-02-21T07:43:05.763 回答
3

只是const unsigned char example = 0;会做得很好。

于 2010-02-21T04:16:12.233 回答
1

我想'\0'这将是一个值为 0 的字符文字,但我也没有看到这一点。

于 2010-02-21T04:18:19.717 回答
0

unsigned char 类型没有后缀。在 C99 中,整数常量是intor long( signedor ) 和。只要值在无符号字符的有效范围内,您就可以放心地使用普通的“U”后缀。unsignedlong long

于 2010-02-21T04:25:11.973 回答
-2

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

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

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

于 2016-04-11T16:45:22.120 回答