如何在C++中指定一个类型为unsigned char的整型字面量?

77

我可以通过以下方式指定一个unsigned long类型的整型字面量:

const unsigned long example = 9UL;

如何对无符号字符执行类似的操作?

const unsigned char example = 9U?;

这是必要的,以避免编译器警告:

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

我希望避免目前使用的冗长解决方案,并且在调用min函数时不要出现'unsigned char',而无需在单独的行上声明9的变量:

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

我稍微修改了你的问题,以符合我认为你的意图。在C++中,像10这样的东西被称为“字面量”(而在C中被称为“常量”)。对于C++开发者来说,这更常见,并且避免了与“example”的声明混淆。 - Johannes Schaub - litb
TL;DR:最易于使用和阅读的是:char(9) uchar(9) - Andrew
@Andrew uchar? - Mr Lister
@Mr Lister 土豆? - Andrew
9个回答

69

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
}

10
楼主,快点把这个答案选为采纳答案吧!不过我建议只使用 _uc,因为它更加简洁,并且与标准的 ul 等具有相同的平等性。 - underscore_d

32

C语言没有提供一种标准的方法来指定比类型int小的整数常量。

然而,stdint.h提供了UINT8_C()宏,可以实现你想要的效果,这基本上是在C中最接近你想要的内容。

但大多数人只是使用没有后缀(得到一个int常量)或U后缀(得到一个无符号的unsigned int常量)。它们对于char大小的值非常有效,而且这也是你从stdint.h宏中获得的主要内容。


3
从glibc 2.26开始,UINT8_C不能提供一个8位整数:# define UINT8_C(c) c - Chih-Hsuan Yen

26

您可以将常量进行类型转换。例如:

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

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

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

不是所有编译器都需要 typedef。


我认为你是唯一一个正确解密了他那个相当机密的问题的人。首先,我也没有弄清楚他到底想问什么。 - Johannes Schaub - litb
没错,这是我目前的解决方法。我希望通过这个问题避免强制类型转换,但看起来答案是没有字面量可以让我避免强制类型转换。 - WilliamKF
使用构造函数语法,这会导致每次都进行对象分配,而不是使用字面量吗? - Ravi Nankani
@RaviNankani 这是一个原始类型的构造函数语法,因此不应该有额外的开销。 - janm
2
我会写出类似这样的代码(因为自C++11以来,uint8_t typedef已经成为标准的一部分):min(uint8_t{9}, example2); - dan_din_pantelimon

16

如果你使用的是Visual C++,并且不需要在编译器之间进行互操作,你可以在数字后面加上ui8后缀,将其转换为无符号8位常量。

min(9ui8, example2);

使用实际的字符常量,如 '9' ,是无法做到这一点的。


11

假设你正在使用std::min,那么你应该明确指定min所使用的类型:

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

3

只需要简单地使用 const unsigned char example = 0; 即可。


1
这是一个 int 字面量,隐式转换为无符号字符(const),对吧? - Scott Smith

1

我想 '\0' 应该是一个值为 0 的字符字面量,但我也不明白它有什么意义。


2
这不是无符号字符,而是有符号字符。 - WilliamKF
14
在C++中,'\0'的类型既不是signed char也不是unsigned char,正如Axel所说,它是char类型。与其他整数类型不同,signed int和int是相同的类型,但signed char和char不是。 - Steve Jessop
我曾认为char隐式地与signed char相同,但我可能在想C语言... - Scott Smith
2
@ScottSmith,C语言中也是同样的情况,有三种不同的类型。如果char是有符号还是无符号则由实现定义。 - Bo R

0

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


-3
问题是如何在C++中“指定一个unsigned char类型的整数'字面量'”,而不是如何声明标识符。
您可以在单引号中使用反斜杠转义和八进制数字。(例如,'\177')
八进制值始终被视为无符号。

不,它并不被视为无符号的,它仍然是 char —— 既不是 unsigned char 也不是 signed char - Ruslan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接