Правила преобразования беззнаковых целых типов приведены в таблице 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, то результат преобразования не определен |
Преобразование указателей
Указатель на значение одного типа может быть преобразован к указателю на значение другого типа. Результат может, однако, оказаться неопределенным из-за отличий в требованиях к выравниванию объектов разных типов и в размере памяти, занимаемом различными типами.
Читать дальше