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