Программирование >>  Элементы языков с и с++ 

1 ... 28 29 30 [ 31 ] 32 33 34 ... 200


Преобразование типов данных

Современные компиляторы многое берут на себя, а неопытный программист этого не замечает и потому должным образом не оценивает происходящее. Но все же надо иметь представление о преобразованиях типов данных, потому что тот же неопытный программист часто заходит в тупик в очевидных ситуациях и недоуменно разводит руками: Чего это оно не идет? Не понимаю... . А не понимает, потому что избалован возможностями современных компиляторов, при которых он родился и вырос. Но они его (если программист не очень грамотный) иногда подводят, и бывает очень сильно.

Итак, при составлении программ все-таки надо знать, что в выражениях обычно участвуют данные разных типов, как и в операциях присвоения, при которых левая часть имеет один тип, а правая другой. И чтобы как-то свести концы с концами, установлены соответствующие правила преобразований данных разных типов.

С Примечание

Преобразования осуществляются для тех типов данных, для которых это имеет смысл.

При вычислении выражений, в которые входят данные разных типов, компилятор строит программу так, что все данные разных типов преобразуются к общему типу по следующим правилам:

□ типы 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. Правила выполнения побитовых логических операций

Значения битов

Результат

операции

Е1 & Е2

Е1 1 Е2

Е1 -Е2

Следует отличать побитовые операции над целыми числами от логических. Например:

int х=1, у=2; bool а=х && у; bool b=x & у;

Здесь:

а = 1, b = о, потому что:

из а = X && у следует: т. к. хэо и у#о, то по определению операции ss результат будет истинен, а в языке С истинный результат имеет значение 1.

С другой стороны, для поразрядного и получим: х = 01, у = ю в двоичной системе счисления, в которую надо перевести операнды, чтобы выполнить побитовую операцию &. Тогда получим: 01 & ю = оо.

Операции и выражения присваивания

Выражения вида i=i+2; можно записывать в виде i+=2; (читается: к i добавить 2). Это правило распространяется на операции: +, -, *, /, %, , , &, , ~.

В листинге 6.3 приведен текст программы, которая подсчитывает число ненулевых битов целого числа и использует операцию сдвига.



1 ... 28 29 30 [ 31 ] 32 33 34 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика