Подтвердить что ты не робот

Как указать целочисленный литерал типа 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);
4b9b3361

Ответ 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')

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