2016-02-03 4 views
5

Каковы правила, используемые C++ для определения типа арифметического выражения с двумя разными целыми типами?Целочисленные правила преобразования C++

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

Например, оба приведенные ниже представлены как unsigned int в VS.

unsigned int us = 0; 
int s = 1; 

auto result0 = us - s; // unsigned int 
auto result1 = s - us; // unsigned int 

Это то же самое для других компиляторов? Существуют ли какие-либо конкретные правила для определения типа?

+2

Вы прочитали [документацию] (http://en.cppreference.com/w/cpp/language/auto)? – NathanOliver

+0

Правила те же, что и для вывода типа шаблона, за исключением случая 'auto x {expr};'/'auto x = {expr};'. – Michael

+6

Это почти похоже на вопрос о продвижении по типу, а затем автоматическом выводе. – NathanOliver

ответ

5

Все это четко определено.

1 является подписан буквально. На самом деле, если вы хотели это unsigned, вам нужно использовать шестнадцатеричную или восьмеричную нотацию, соответствующий суффикс (например, u) или литой.

Если арифметическая операция встречается, что имеет signed int и unsigned int в качестве аргументов, то это signed intпревращают к unsigned int типа.

+0

Все детали интегрального преобразования зависят от типа адресата, но когда это авто, оно неизвестно? –

+2

«Все детали интегрального преобразования зависят от типа назначения». Абсолютно то, что это ** никогда. – Bathsheba

+0

http://en.cppreference.com/w/cpp/language/implicit_cast#Integral_conversions –

0

Вот короткий, rought ответ, я надеюсь, что это полезно, даже если она не покрывает все, и даже может быть упрощением:

  1. литералы подписаны, если не указано как «U».

  2. В интегральных выражениях, связанных с различными типами, поощряются более мелкие целые типы (до int, если все задействованные типы будут вписываться в int, а в противном случае - в unsigned int), поэтому при значении без знака и значении, например, добавляются, подписанное значение «продвигается» на unsigned int, если неподписанная переменная имеет одинаковую ширину бита, как int. Таким образом, unsigned int считается компилятором как «больше», чем подписанный int в правилах продвижения, даже если во время выполнения фактические значения, хранящиеся в переменных, легко вписываются в подписанное представление того же количества бит.

  3. Обратите внимание, что символ «char» может означать символ без знака, тогда как «int» всегда означает подписанный int.

+0

3. Не вся история, char, unsigned char и signed char - 3 различных типа. Стандарт C гарантирует, что все члены базового набора символов имеют неотрицательные значения. Редактирование ответа. –