@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;
}
  • Вопрос задан
  • 119 просмотров
Решения вопроса 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.
Иными словами, все это выражение было отдано на откуп продвижению целочисленных типов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Wexter
https://en.cppreference.com/w/cpp/language/operato...

If either operand has scoped enumeration type, no conversion is performed: the other operand and the return type must have the same type.
Otherwise, if either operand is long double, the other operand is converted to long double.
Otherwise, if either operand is double, the other operand is converted to double.
Otherwise, if either operand is float, the other operand is converted to float.
Otherwise, the operand has integer type (because bool, char, char8_t, (since C++20) char16_t, char32_t, (since C++11) wchar_t, and unscoped enumeration were promoted at this point) and integral conversions are applied to produce the common type, as follows:
Ответ написан
Ваш ответ на вопрос

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

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