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

Как написать неподписанный короткий int-литерал?

42 как unsigned int хорошо определен как "42U".

unsigned int foo = 42U; // yeah!

Как я могу написать "23", чтобы было ясно, что это unsigned short int?

unsigned short bar = 23; // booh! not clear!

ИЗМЕНИТЬ, чтобы смысл вопроса был более ясным:

template <class T>
void doSomething(T) {
    std::cout << "unknown type" << std::endl;
}

template<>
void doSomething(unsigned int) {
    std::cout << "unsigned int" << std::endl;
}

template<>
void doSomething(unsigned short) {
    std::cout << "unsigned short" << std::endl;
}

int main(int argc, char* argv[])
{
    doSomething(42U);
    doSomething((unsigned short)23); // no other option than a cast?

    return EXIT_SUCCESS;
}
4b9b3361

Ответ 1

Вы не можете. Числовые литералы не могут иметь тип short или unsigned short.

Конечно, чтобы назначить bar, значение литерала неявно преобразуется в unsigned short. В вашем первом примере кода вы можете сделать это преобразование явным с литой, но я думаю, что уже очевидно, какое преобразование будет иметь место. Кастинг потенциально хуже, поскольку с некоторыми компиляторами он подавит любые предупреждения, которые будут выдаваться, если буквальное значение выходит за пределы диапазона unsigned short. Опять же, если вы хотите использовать такое значение по уважительной причине, то подавление предупреждений является хорошим.

В примере в вашем редактировании, где это скорее будет функция шаблона, а не перегруженная функция, у вас есть альтернатива литой: do_something<unsigned short>(23). С перегруженной функцией вы все равно можете избежать приведения с помощью:

void (*f)(unsigned short) = &do_something;
f(23);

... но я не советую. Если ничего другого, это работает, только если версия unsigned short существует, тогда как вызов с литой выполняет обычное разрешение перегрузки, чтобы найти наиболее совместимую версию.

Ответ 2

unsigned short bar = (unsigned short) 23;

или в новом говорят....

unsigned short bar = static_cast<unsigned short>(23);

Ответ 3

Нет никаких модификаторов для unsigned short. Целые числа, которые имеют тип int по умолчанию, обычно неявно преобразуются в тип цели без проблем. Но если вы действительно хотите явно указать тип, вы можете написать следующее:

unsigned short bar = static_cast<unsigned short>(23);

Как я вижу, единственная причина - использовать такое указание для правильного типа шаблона вывода:

func( static_cast<unsigned short>(23) );

Но для такого случая более понятным было бы следующее:

func<unsigned short>( 23 );

Ответ 4

по крайней мере в Visual Studio (не менее 2013 и более поздних) вы можете написать

23ui16

для получения константы типа unsigned short.

см. определения макросов INT8_MIN, INT8_MAX, INT16_MIN, INT16_MAX и т.д. в stdint.h

В настоящий момент я не знаю, является ли это частью стандартного C/С++

Ответ 5

К сожалению, единственный для этого метод -

Один или два символа в одинарных кавычках ('), которому предшествует буква L

Согласно http://cpp.comsci.us/etymology/literals.html

Это означает, что вам нужно будет представлять ваш номер как escape-последовательность ASCII:

unsigned short bar = L'\x17';

Ответ 6

К сожалению, они не могут. Но если люди просто смотрят на два слова позади номера, они должны ясно видеть, что это короткий... Это не так двусмысленно. Но было бы хорошо.

Ответ 7

Если вы выражаете количество в виде четырехзначного шестнадцатеричного числа, короткое замыкание без знака может быть более четким.

unsigned short bar = 0x0017;

Ответ 8

Вероятно, вы не должны использовать короткий, если у вас их не много. Он предназначен для использования меньше хранилища, чем int, но этот int будет иметь "естественный размер" для архитектуры. Логически следует, что короткий, вероятно, нет. Подобно битполам, это означает, что шорты можно рассматривать как компромисс между пространством и временем. Обычно это стоит того, если он покупает вам много места. Однако вряд ли у вас будет очень много литералов в вашем приложении, поэтому не было необходимости предусматривать короткие литералы. Случаи просто не перекрывались.