Как мне указать целочисленный литерал типа unsigned char в C ++? - PullRequest
40 голосов
/ 21 февраля 2010

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

Ответы [ 9 ]

35 голосов
/ 25 апреля 2016

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
}
28 голосов
/ 21 февраля 2010

C не предоставляет стандартного способа обозначения целочисленной константы с шириной меньше ширины типа int.

Тем не менее, stdint.h предоставляет макрос UINT8_C() для выполнения чего-то, что в значительной степени приближается к тому, что вы ищете, как вы получите в C.

Но большинство людей просто используют без суффикса (чтобы получить int константу) или U суффикса (чтобы получить unsigned int константу). Они отлично работают для значений размера char, и это почти все, что вы получите от макроса stdint.h в любом случае.

19 голосов
/ 21 февраля 2010

Вы можете разыграть константу. Например:

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

Вы также можете использовать синтаксис конструктора:

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

typedef требуется не для всех компиляторов.

11 голосов
/ 02 декабря 2011

Если вы используете Visual C ++ и вам не нужна совместимость между компиляторами, вы можете использовать суффикс ui8 для числа, чтобы превратить его в 8-битную константу без знака.

Вы не можете сделать это с фактическими константами типа «9».

7 голосов
/ 21 февраля 2010

Предполагая, что вы используете std::min, вам нужно явно указать, какой тип min следует использовать как таковой

unsigned char example2 = 0;
min<unsigned char>(9, example2);
4 голосов
/ 21 февраля 2010

Просто const unsigned char example = 0; подойдет.

0 голосов
/ 11 апреля 2016

Вопрос заключался в том, как «указать целое число« литерал »типа unsigned char в C ++?». Не как объявить идентификатор.

Вы используете обратную косую черту и восьмеричные цифры в апострофах. (например, '\ 177')

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

0 голосов
/ 21 февраля 2010

Не существует суффикса для неподписанных типов символов. Целочисленные константы могут быть int или long (signed или unsigned) и в C99 long long. Вы можете без проблем использовать простой суффикс 'U', если значение находится в допустимом диапазоне беззнаковых символов.

0 голосов
/ 21 февраля 2010

Полагаю, '\0' будет символьным литералом со значением 0, но я тоже не вижу смысла.

...