@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;
}
  • Вопрос задан
  • 122 просмотра
Решения вопроса 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.
Иными словами, все это выражение было отдано на откуп продвижению целочисленных типов.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы