@serhiops
Python/JavaScript/C++

Почему при арифметических операциях bool конвертируется в int?

Исходя из правил приведения типов, результат любого вычисления конвертируется в наиболее точный тип данных из типов данных тех значений, которые участвуют в вычислении. То есть при сложении short и bool должен получится short. Но в данном урывке кода видно, что всё конвертируется в int. Правильно ли я понимаю, что bool из-за того,что под капотом реализован как целое число, конвертируется в int?
#include <iostream>
#include <typeinfo>
using std::cout, std::endl;

int main(int argc, char** argv){
    bool  x = true;
    short y = 7 ;
    auto result = x + y;  //8
    cout << ( typeid(result) == typeid(short) ) <<endl; //false
    cout << ( typeid(result) == typeid(int) ) <<endl;   //true
    return 0;
}
  • Вопрос задан
  • 142 просмотра
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
В данном случае int правильно выбран в качестве типа для result.

Чтобы разобраться в логике этого поведения, нужно изучить т.н. технику продвижения целочисленных типов - Integral Promotion.
В выражении x + y работает только она.

В частности. Именно продвижение целых подразумевает неявное преобразование булева значения к целому со строго однозначным результатом: [expr.conv.6].
true всегда в таких случаях будет преобразован в 1 с типом int.

Конкретно для кода x + y типом результата значения будет именно int, потому что ранг short int ниже ранга int в правилах продвижения. Арифметические операции с значениями всех типов, чей ранг ниже int, всегда подвергаются продвижению и выполняются на значениях с типом int.

Дело довершает auto result в левой части выражения. Обобщение принимает тип результата выражения справа от знака равенства, коим и является int.
Иными словами, все это выражение было отдано на откуп продвижению целочисленных типов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы