C. Бочков - Язык программирования Си для персонального компьютера
Правила преобразования знаковых целых типов приведены в таблице 4.2. Предполагается, что тип char по умолчанию является знаковым. Если во время компиляции используется опция, которая изменяет умолчание для типа char со знакового на беззнаковый, то для него выполняется преобразование как для типа unsigned char (см. таблицу 4.3).
Таблица 4.2.
Преобразование знаковых целых типов От типа К типу Метод char short дополнение знаком char long дополнение знаком char unsigned char сохранение битового представления; char unsigned short старший бит теряет функцию знакового бита дополнение знаком до short; преобразование short в unsigned short char unsigned long дополнение знаком до long; преобразование long в unsigned long char float дополнение знаком до long; преобразование long к float char double дополнение знаком до long; преобразование long к double short char сохранение младшего байта short long дополнение знаком short unsigned char сохранение младшего байта short unsigned short сохранение битового представления; старший бит теряет функцию знакового бита short unsigned long дополнение знаком до long; преобразование long в unsigned long short float дополнение знаком до long; преобразование long к float short double дополнение знаком до long; преобразование long к double long char сохранение младшего байта long short сохранение младшего слова long unsigned char сохранение младшего байта long unsigned short сохранение младшего слова long unsigned long сохранение битового представления; старший бит теряет функцию знакового бита long float представляется как float; возможна некоторая потеря точности long double представляется как double; возможна некоторая потеря точностиПримечание. В СП MSC и СП ТС тип int эквивалентен типу short и преобразование для типа int производится как для типа short. В некоторых реализациях языка Си тип int эквивалентен типу long и преобразование для типа int производится как для типа long.
Преобразование беззнаковых целых типовБеззнаковое целое значение преобразуется к короткому беззнаковому целому значению или короткому знаковому целому значению путем усечения старших битов. Беззнаковое целое значение преобразуется к длинному беззнаковому целому значению или длинному знаковому целому значению путем дополнения нулями слева. Беззнаковое целое значение преобразуется к значению с плавающей точкой путем преобразования к типу long, а затем преобразования значения типа long к значению с плавающей точкой.
Если беззнаковое целое значение преобразуется к знаковому целому значению того же размера, то битовое представление не меняется. Однако, если старший (знаковый) бит был установлен в единицу, представляемое значение изменится.
Правила преобразования беззнаковых целых типов приведены в таблице 4.3.
Таблица 4.3.
Преобразование беззнаковых целых типов От типа К типу Метод unsigned char char сохранение битового представления; старший бит становится знаковым unsigned char short дополнение нулевыми битами unsigned char long дополнение нулевыми битами unsigned char unsigned short дополнение нулевыми битами unsigned char unsigned long дополнение нулевыми битами unsigned char float дополнение нулевыми битами до long; преобразование long к float unsigned char double дополнение нулевыми битами до long; преобразование long к double unsigned short char сохранение младшего байта unsigned short short сохранение битового представления; старший бит становится знаковым unsigned short long дополнение нулевыми битами unsigned short unsigned char сохранение младшего байта unsigned short unsigned long дополнение нулевыми битами unsigned short float дополнение нулевыми битами до long; преобразование long к float unsigned short double дополнение нулевыми битами до long; преобразование long к double unsigned long char сохранение младшего байта unsigned long short сохранение младшего слова unsigned long long сохранение битового представления; старший бит становится знаковым unsigned long unsigned char сохранение младшего байта unsigned long unsigned short сохранение младшего слова unsigned long float преобразование к long; преобразование long к float unsigned long double преобразование к long; преобразование long к double (в версии 5 СП MSC это преобразование производится напрямую, без промежуточного типа long)Примечание. В СП MSC и СП ТС тип unsigned int эквивалентен типу unsigned short и преобразование для типа unsigned int производится как для типа unsigned short. В некоторых реализациях языка Си тип unsigned int эквивалентен типу unsigned long и преобразование для типа int производится как для типа unsigned long.
Преобразование плавающих типов Значения типа float преобразуются к типу double без потери точности. Значения типа double при преобразовании к типу float представляются с некоторой потерей точности. Однако если порядок значения типа double слишком велик для представления экспонентой значения типа float, то происходит потеря значимости, о чем сообщается во время выполнения.
Значения с плавающей точкой преобразуются к целым типам в два приема: сначала производится преобразование к типу long, а затем преобразование этого значения типа long к требуемому типу. Дробная часть плавающего значения отбрасывается при преобразовании к long; если полученное значение слишком велико для типа long, то результат преобразования не определен. Правила преобразования плавающих типов приведены в таблице 4.4.
Таблица 4.4.
От типа К типу Метод float char преобразование к long; преобразование long к char float short преобразование к long; преобразование long к short float long усечение дробной части; результат не определен, если он слишком велик для представления типом long float unsigned short преобразование к long; преобразование long к unsigned short float unsigned long преобразование к long; преобразование long к unsigned long float double дополнение мантиссы нулевыми битами справа double char преобразование к float; преобразование float к char double short преобразование к float; преобразование float к short double long усечение дробной части; результат не определен, если он слишком велик для представления типом long double unsigned short преобразование к long; преобразование long к unsigned short double unsigned long преобразование к long; преобразование long к unsigned long double float усечение младших битов мантиссы; возможна потеря точности; если значение слишком велико для представления типом float, то результат преобразования не определенПреобразование указателейУказатель на значение одного типа может быть преобразован к указателю на значение другого типа. Результат может, однако, оказаться неопределенным из-за отличий в требованиях к выравниванию объектов разных типов и в размере памяти, занимаемом различными типами.