A.5.2. Неявное преобразование типа
Целочисленные типы или типы с плавающей точкой (раздел A.8) могут свободно смешиваться в операторах присваивания и в выражениях. При первой же возможности значения преобразовываются так, чтобы не потерять информацию. К сожалению, преобразования, уничтожающие значение, выполняются также неявно.
A.5.2.1. Продвижения
Неявные преобразования, сохраняющие значения, обычно называют float
в значение типа double
также считается продвижением.
Продвижения используются как часть обычных арифметических преобразований (раздел A.5.2.2).
A.5.2.2. Преобразования
Значения фундаментальных типов можно преобразовывать друг в друга самыми разными способами. При написании программы следует избегать неопределенного поведения и непредсказуемых преобразований, которые незаметно искажают информацию (см. разделы 3.9 и 25.5.3). Компиляторы обычно способны предупредить о многих сомнительных преобразованиях.
• unsigned
), то результирующее значение будет иметь столько же битов, сколько и источник, при условии, что оно может поместиться в целевой области памяти (старшие биты при необходимости могут быть отброшены). Если целевой тип имеет знак, то значение останется без изменения, при условии, что его можно представить с помощью целевого типа; в противном случае значение определяется реализацией языка. Обратите внимание на то, что типы bool
и char
являются целочисленными.
• double
считается продвижением.
• void*
(см. разделы 17.8 и 27.3.5). Указатель (ссылка) на производный класс можно неявно преобразовать в указатель (ссылку) на доступный и однозначно определенный базовый класс (см. раздел 14.3). Константное выражение (см. разделы A.5 и 4.3.1), равное нулю, можно неявно преобразовать в любой другой тип указателя. Указатель типа T*
можно неявно преобразовать в указатель const T*
. Аналогично ссылку T&
можно неявно преобразовать в ссылку типа const T&
.
• bool
. Ненулевое значение преобразовывается в значение true
, а нуль — в значение false
.
•
•
1. Если один из операндов имеет тип long double
, то другой преобразовывается в тип long double
. В противном случае, если один из операндов имеет тип double
, другой преобразовывается в тип double
. В противном случае, если один из операндов имеет тип float
, другой преобразовывается в тип float
. В противном случае над обоими операндами целочисленного типа выполняется продвижение.