Для более подробного ответа. Посмотрите, что говорится в разделе §5 / 9 стандарта C ++.
Многие бинарные операторы, которые ожидают операнды арифметического или перечислимого типа, вызывают преобразования и выдают типы результатов аналогичным образом. Цель состоит в том, чтобы получить общий тип,
который также является типом результата .
Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:
- Если один из операндов имеет тип long double, другой должен быть преобразован в long double.
- В противном случае, если один из операндов является двойным, другой должен быть преобразован в двойной.
- В противном случае, если один из операндов является float, другой должен быть преобразован в float.
- В противном случае интегральные преобразования (4.5) должны выполняться для обоих операндов. 54)
- Затем, если один из операндов длинен без знака, другой должен быть преобразован в длинный знак без знака.
- В противном случае, если один операнд является длинным int, а другой - без знака int, то, если long int может представлять все значения беззнакового int, беззнаковое int должно быть преобразовано в long int; в противном случае оба операнда должны быть преобразованы в unsigned long int.
- В противном случае, если один из операндов длинный, другой должен быть преобразован в длинный.
- В противном случае, если один из операндов не подписан, другой должен быть преобразован в беззнаковый.
[Примечание: в противном случае единственным оставшимся случаем является то, что оба операнда являются int]
^
это XOR.