Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
43
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

76 Глава 2

Кроме того, как я писал в Ех2_05. срр относительно присваивания с участием раз- ных типов, вы всегда можете прояснить код, сделав приведение явным:

Вы можете применять явные приведения с числовыми значениями любых типов, но должны осознавать возможность потери информации. Если вы приводите значе- ние типа float или double к типу long, например, то при преобразовании теряете дробную часть, поэтому если значение было меньше 1.0, результатом будет 0. Если же вы приводите значение типа double к типу float, то теряете точность, потому что float имеет лишь 7-значную точность, в то время как double — 15-значную. Даже приведение между целочисленными значениями может привести к потенциальной потере информации, в зависимости от конкретных значений, участвующих в нем. Например, значение целого типа long может выйти за пределы допустимых для типа short, поэтому приведение значения long к типу short может привести к потере информации.

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

Приведения в старом стиле

До того, как в С++ появилась операция приведения staticcatso () (а также другие операции приведения: const_cast<> (), dynamic_cast<> () и reinterpret_ casto (), о которых мы поговорим позднее), явное приведение результата выраже- ния к другому типу записывалось следующим образом:

Здесь результат выражения приводится к типу, указанному в скобках. Например, оператор вычисления strips_per_roll из предыдущего примера мог быть записан так:

По сути, существуют четыре разных вида приведений, и синтаксис приведений старого стиля покрывал все. По этой причине код, использующий приведения в ста- ром стиле, более подвержен ошибкам — компилятору не всегда были ясны ваши наме- рения, и вы не получали ожидаемый результат. Хотя вы встретите в унаследованном коде интенсивное использование приведений старого стиля (это все еще часть язы- ка, и их много в коде MFC — по причинам исторического характера), я настоятельно рекомендую в новом коде применять только новые приведения.

Битовые операции

Битовые операции трактуют свои операнды как последовательности индивидуаль- ных битов, а не числовые значения. Они работают только с целочисленными пере- менными или целыми константами в качестве операндов, поэтому с ними могут ис- пользоваться только типы данных short, int, long, signed char и char, а также их беззнаковые варианты. Битовые операции удобны для программирования аппаратных

Данные, переменные и вычисления 77

устройств, где состояние устройства часто представляется серией индивидуальных флагов (то есть, каждый бит может описывать состояние определенного аспекта дан- ного устройства), или же их можно применять в ситуациях, когда желательно упако- вать набор флагов "включено/выключено" в единую переменную. Вы увидите их в действии, когда будете подробно изучать средства ввода-вывода, где отдельные биты служат для управления различными опциями управления потоками данных. Существует шесть битовых операций.

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

Битовое И

Битовое И (&) — это бинарная операция, которая комбинирует соответствующие биты своих операндов определенным образом. Если в обоих операндах соответству- ющие биты равны 1, то и в результате будет 1, если же оба или один из битов операн- дов равен 0, то и в результате соответствующий бит будет равен 0.

Эффект применения конкретной битовой операции часто показывают с помощью таблицы истинности. В ней показаны все возможные комбинации битов операндов и соответствующий результирующий бит, полученный в результате применения опе- ратора. Таблица истинности для & представлена в табл. 2.5.

Таблица 2.5. Таблица истинности для операции битового И

Рис. 2.8. Работа операции битового И

Д ля того чтобы понять, что произойдет, нужно взглянуть на битовые шаблоны. Буквы 'А' и 'Z' соответствуют шестнадцатеричным значениями 0x41 и 0х5А, соответ- ственно (см. в приложении Б таблицу кодов ASCII). Работа операции битового И с этими двумя значениями показана на рис. 2.8.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]