|
Программирование >> Элементы языков с и с++
Преобразование типов данных Современные компиляторы многое берут на себя, а неопытный программист этого не замечает и потому должным образом не оценивает происходящее. Но все же надо иметь представление о преобразованиях типов данных, потому что тот же неопытный программист часто заходит в тупик в очевидных ситуациях и недоуменно разводит руками: Чего это оно не идет? Не понимаю... . А не понимает, потому что избалован возможностями современных компиляторов, при которых он родился и вырос. Но они его (если программист не очень грамотный) иногда подводят, и бывает очень сильно. Итак, при составлении программ все-таки надо знать, что в выражениях обычно участвуют данные разных типов, как и в операциях присвоения, при которых левая часть имеет один тип, а правая другой. И чтобы как-то свести концы с концами, установлены соответствующие правила преобразований данных разных типов. С Примечание Преобразования осуществляются для тех типов данных, для которых это имеет смысл. При вычислении выражений, в которые входят данные разных типов, компилятор строит программу так, что все данные разных типов преобразуются к общему типу по следующим правилам: □ типы int и char могут свободно смешиваться в арифметических выражениях, т. к. перед вычислением переменная типа char автоматически преобразуется в int (конечно, если оба типа относятся к числу). Поэтому когда мы видим, что символ может быть отрицательным числом (например. -1), то его лучше помещать в переменную, объявленную как int; □ к каждой арифметической операции применяются следующие правила: низший тип всегда преобразуется в высший: short в int, float в double, int в long И т. Д.; f □ при присвоении тип значения правой части всегда преобразуется в тип левой части. Отсюда надо учитывать, что: если переменная, расположенная справа от знака присвоения, имеет тип float, а переменная, расположенная слева, - int, то произойдет преобразование в тип int, и дробная часть значения переменной типа float будет отброшена; Побитовые логические операции Эти операции выполняются над соответствующими битами чисел, имеющими целый тип. Если операнд- не целое число, то оно автоматически преобразуется в целое. Побитовые операции таковы: □ S - поразрядное умножение (конъюнкция). Формат: int а, Ь=3, с=4; а=Ь & с; f □ I - поразрядное сложение (дизъюнкция) или включающее или . Формат: int а, Ь=3, с=4; а=Ь с; О - поразрядное исключающее или . Формат: int а, Ь=3, с=4; а=Ь с; □--операция дополнения. Формат: int а, Ь=3, с=4; а=Ь ~ с; О - СДВИГ разрядов вправо. , Формат: int а, Ь=3, с=4; а=Ь>>с; если справа расположена переменная типа double, а слева переменная типа float, то произойдет преобразование в тип float с округлением; если справа расположена переменная типа long, а слева переменная типа int, то произойдет преобразование в тип int, при этом у значения переменной справа будут отброшены старшие биты (вот это может быть погрешность!); □ любое выражение может быть приведено к желаемому типу не автоматически при преобразованиях, а принудительно с помощью конструкции: < (имя типа) выражение>. Такие преобразования называют кастингом. Например, существует стандартная функция maiioc(число), которая выделяет указанное в ее аргументе количество байтов памяти и которая возвращает адрес выделенного участка. Но функция возвращает адрес неопределенного типа (ее тип - void), т. е. непонятно, данные какого типа мы можем размещать в выделенной области. Чтобы настроиться на выделенную область, в которой хотим, например, размещать данные типа char, мы должны неопределенный выход функции привести к нашему типу с помощью кастинга (char*)maiioc (число) (об адресах будем говорить в последующих главах). □ - сдвиг разрядов влево. Формат: int а, Ь=3, с=4; а=Ь с;. Побитовые логические операции выполняются по правилам, приведенным в табл. 6.1. Таблица 6.1. Правила выполнения побитовых логических операций
Следует отличать побитовые операции над целыми числами от логических. Например: int х=1, у=2; bool а=х && у; bool b=x & у; Здесь: а = 1, b = о, потому что: из а = X && у следует: т. к. хэо и у#о, то по определению операции ss результат будет истинен, а в языке С истинный результат имеет значение 1. С другой стороны, для поразрядного и получим: х = 01, у = ю в двоичной системе счисления, в которую надо перевести операнды, чтобы выполнить побитовую операцию &. Тогда получим: 01 & ю = оо. Операции и выражения присваивания Выражения вида i=i+2; можно записывать в виде i+=2; (читается: к i добавить 2). Это правило распространяется на операции: +, -, *, /, %, , , &, , ~. В листинге 6.3 приведен текст программы, которая подсчитывает число ненулевых битов целого числа и использует операцию сдвига.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |