Как мне указать целочисленный литерал типа unsigned char в C ++?

StackOverflow https://stackoverflow.com/questions/2304732

Вопрос

Я могу указать целочисленный литерал типа 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')

Восьмеричное значение всегда считается беззнаковым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top