Как указать целочисленный литерал типа unsigned char в С++?
Я могу указать целочисленный литерал типа unsigned long следующим образом:
const unsigned long example = 9UL;
Как мне сделать то же самое для unsigned char?
const unsigned char example = 9U?;
Это необходимо, чтобы избежать предупреждения компилятора:
unsigned char example2 = 0;
...
min(9U?, example2);
Я надеюсь избежать подробного обходного пути, который у меня есть, и не имеет "unsigned char" в строке, вызывающей min, без объявления 9 в переменной на отдельной строке:
min(static_cast<unsigned char>(9), example2);
Ответы
Ответ 1
C не предоставляет стандартного способа назначения целочисленной константы с шириной меньше, чем тип int
.
Однако stdint.h
предоставляет макрос UINT8_C()
, чтобы сделать что-то, что почти так же близко к тому, что вы ищете, поскольку вы попадете на C.
Но большинство людей просто не используют ни суффикса (для получения константы int
), ни суффикса U
(для получения константы unsigned int
). Они отлично работают для значений char, и это почти все, что вы получите от макроса stdint.h
.
Ответ 2
Вы можете указать константу. Например:
min(static_cast<unsigned char>(9), example2);
Вы также можете использовать синтаксис конструктора:
typedef unsigned char uchar;
min(uchar(9), example2);
typedef не требуется для всех компиляторов.
Ответ 3
С++ 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
}
Ответ 4
Предполагая, что вы используете std::min
то, что вы на самом деле должны делать, это явно указать, какой тип min
должен использовать как таковой
unsigned char example2 = 0;
min<unsigned char>(9, example2);
Ответ 5
Если вы используете Visual С++ и не нуждаетесь в интероперабельности между компиляторами, вы можете использовать суффикс ui8 на номере, чтобы превратить его в неподписанную 8-битную константу.
min(9ui8, example2);
Вы не можете сделать это с помощью реальных констант char, таких как "9".
Ответ 6
Просто const unsigned char example = 0;
будет работать нормально.
Ответ 7
Я полагаю, что '\0'
будет литералом char со значением 0, но я тоже не вижу смысла.
Ответ 8
Нет суффикса для неподписанных типов char. Целочисленные константы: int
или long
(signed
или unsigned
) и в C99 long long
. Вы можете использовать суффикс "U" без беспокойства, пока значение находится в допустимом диапазоне символов без знака.
Ответ 9
Вопрос заключался в том, как "указать целочисленный" литерал "типа unsigned char в С++?". Не как объявить идентификатор.
Вы используете обратную косую черту и восьмеричные цифры в апострофах. (например, '\ 177')
В восьмеричном значении всегда принимается без знака.