|
Программирование >> Перегруженные имена функций и идентификаторы
Преобразование типов при присваивании В операциях присваивания тип значения, которое присваивается, преобразуется к типу переменной, получающей это значение. В Си допускаются преобразования при присваивании между целыми и плавающими типами, даже в случаях, когда преобразование влечет за собой потерю информации. Знаковое целое преобразуется к короткому знаковому целому (short signed int) посредством усечения старших битов. Знаковое целое преобразуется к длинному знаковому целому (long signed int) путем размножения знака влево. Преобразование знаковых целых к плавающим величинам происходит без потери информации, за исключением потери некоторой точности, когда преобразуются величины long в float. При преобразовании знакового целого к беззнаковому целому (unsigned int), знаковое целое преобразуется к размеру беззнакового целого и результат интерпретируется как беззнаковая величина. Тип unsigned int эквивалентен или unsigned short, или unsigned long типам в зависимости от оборудования. Преобразование из unsigned int производятся как для unsigned short или unsigned long в зависимости от того, что подходит. Преобразование плавающих типов Величины float преобразуются к double, не меняясь в значении. Величины double, преобразованные к float, представляются точно, если возможно. Если значение слишком велико для float, то точность теряется. Плавающие величины преобразуются к целым типа long. Преобразование к другим целым типам выполняется как для long. Дробная часть плавающей величины отбрасывается при преобразовании к long; если результат слишком велик для long, то результат преобразования неопределен. Преобразование адресных типов Указатель на величину одного типа может быть преобразован к указателю на величину другого типа. Результат может быть, однако, неопределенным из-за отличия в требованиях к выравниванию и размерам памяти. В некоторых реализациях имеются специальные ключевые слова near, far, huge, модифицирующие размер указателей в программах. Указатель может быть преобразован к указателю другого размера; путь преобразования зависит от реализации. Значение указателя может быть преобразовано к целой величине. Путь преобразования зависит от размера указателя. Целый тип может быть преобразован к адресному типу. Если целый тип того же самого размера, что и адресный, то производится простое преобразование к виду указателя (беззнакового целого). Если размер целого типа отличен от размера адресного типа, то целый тип вначале преобразуется к размеру указателя. Затем полученное значение представляется как указатель. Если поддерживаются специальные ключевые слова near, far, huge, то может быть сделано неявное преобразование адресных величин. В частности, компилятор может по умолчанию создавать указатели определенного размера и производить преобразования получаемых адресных величин, если в программе не появится forward объявление, переопределяющее это умолчание. Преобразования других типов Из определения типа enum следует, что величины enum являются величинами типа int. Поэтому преобразования в и из типа enum осуществляется как для int типов. Тип int эквивалентен типам short или long в зависимости от реализации. Не допустимы преобразования объектов типа структур и совмещений. Тип void не имеет значения по определению. Поэтому он не может быть преобразован к любому другому типу, но любая величина может быть преобразована к типу void путем присваивания. Тем не менее, величина может быть явно преобразована cast операцией к void. Преобразования type-cast Явное преобразование типа может быть сделано посредством type-cast. Преобразования type-cast имеют следующую синтаксическую форму: (<type-name)<operand> где <type-name> специфицирует особенности типа, а <operand> является величиной, которая должна быть преобразована к специфицированному типу. Преобразование операнда осуществляется в процессе присвоения его переменной типа <type-name>. Правила преобразования для операции присваивания допустимы для преобразований type-cast полностью. Имя типа void может быть использовано в операции cast, но результирующее выражение не может быть присвоено любому объекту. Преобразования, выполняемые операциями Преобразования, выполняемые операциями Си, зависят от самих операций и от типа операнда или операндов. Многие операции выполняют обычные арифметические преобразования. Си разрешает некоторую арифметику с указателями. В адресной арифметике целые величины преобразуются к определенным адресам памяти. Преобразования при вызовах функций Тип преобразования, выполняемый над аргументами в вызове функции, зависит от того, было ли forward объявление, определяющее типы аргументов для вызываемой функции. Если forward объявление было и оно включает определение типов аргументов, то компилятор осуществляет контроль типов. Если forward объявления не было, или если в forward объявлении опущен список типов аргументов, то над аргументами вызываемой функции производятся только обычные арифметические преобразования. Преобразования производятся независимо для каждого аргумента вызова. Смысл этих преобразований сводится к тому, что величины типа float преобразуются к double, величины типов char и short преобразуются к int, величины типов unsigned char и unsigned short преобразуются к unsigned int. Если поддерживаются специальные ключевые слова near, far, huge, то могут быть также сделаны неявные преобразования адресных величин, посылаемых в функцию. Эти неявные преобразования могут быть переопределены заданием в forward объявлении списка типов аргументов, что позволит компилятору выполнить контроль типов.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |