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

时间:2010-02-21 04:12:55

标签: c++ integer constants language-lawyer

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

const unsigned long example = 9UL;

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

const unsigned char example = 9U?;

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

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

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

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

9 个答案:

答案 0 :(得分:35)

C++11 introduced user defined literals. It can be used like this:

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
}

答案 1 :(得分:27)

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

然而,stdint.h确实提供UINT8_C()宏来做一些与你正在寻找的内容非常接近的内容。

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

答案 2 :(得分:19)

你可以施放常数。例如:

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

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

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

所有编译器都不需要typedef。

答案 3 :(得分:11)

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

min(9ui8, example2);

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

答案 4 :(得分:7)

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

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

答案 5 :(得分:4)

只需const unsigned char example = 0;即可。

答案 6 :(得分:0)

我认为'\0'将是一个值为0的char字面值,但我也没有看到这一点。

答案 7 :(得分:0)

unsigned char类型没有后缀。整数常量可以是intlongsignedunsigned),也可以是C99 long long。只要该值在无符号字符的有效范围内,您就可以毫无顾虑地使用普通的“U”后缀。

答案 8 :(得分:0)

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

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

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