2013-03-09 2 views
3
#include <iostream> 
#include <typeinfo> 

using namespace std; 

int main() 
{ 
    int s = 2; 
    unsigned int u = 3; 

    auto k = s + u; 

    if (typeid(k) == typeid(s)) 
     cout << "signed" << endl; 
    else if (typeid(k) == typeid(u)) 
     cout << "unsigned" << endl; 
    else 
     cout << "error" << endl; 
} 

Выход этой программы GCC является:C++ 11 тип (подписанный + без знака)?

unsigned 

Я уверен, что это либо не определено или определяется реализацией поведение - но я не могу показаться, чтобы соединить точки со стандартом.

Можете ли вы сказать мне, где в стандарте это сказано?

+0

Да, это стандартное поведение. unsigned types являются «большими», чем подписанные типы того же размера. – Mysticial

+0

Почему вы говорите, что это неопределенное или определенная реализация, что вы ожидаете? – ChiefTwoPencils

+1

При работе на 'signed' и' unsigned', 'unsigned' выигрывает. У меня были серьезные проблемы, возникшие из-за этого факта ... Урок, извлеченный из жизни. – 2013-03-09 19:15:15

ответ

11

Что вы видите, это всего лишь эффекты Usual Arithmetic Conversions.

стандарт говорит следующее:

§5 [expr] p7:

Многих бинарных операторам, которые ожидают операнды арифметического или типа перечисления преобразования вызывает и типов результатов выходов аналогичным образом. Цель состоит в том, чтобы дать общий тип, который также является типом результата. Эта модель называется обычные арифметические преобразования, которые определены следующим образом:

  • [...]
  • В противном случае, интегральные акции (4.5), должны быть выполнены на обоих операндов. Тогда следующие правила должны применяться к рекламируемым операндам:
    • [...]
    • В противном случае оба операнд должен быть преобразованы без знака целого типа, соответствующего типу операнда с подписью целочисленного типа.
+0

Спасибо, это то, что я искал. –

Смежные вопросы