
- •Глава 2
- •Глава 2. Обзор языка Java 31_
- •Глава 2. Обзор языка Java
- •Глава 2. Обзор языка Java 37
- •Глава 2. Обзор языка Java 39
- •Глава 2. Обзор языка Java 41
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 43_
- •Глава 2. Обзор языка Java 45_
- •Глава 2. Обзор языка Java 47
- •Глава 2. Обзор языка Java 49_
- •Часть I. Язык Java
- •Глава 2. Обзор языка Java 57
- •Глава 3
- •Глава 3. Типы данных, переменные и массивы 53
- •Глава 3. Типы данных, переменные и массивы _ 55
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 59_
- •Глава 3. Типы данных, переменные и массивы 61_
- •Глава 3. Типы данных, переменные и массивы
- •Глава 3. Типы данных, переменные и массивы 65_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 67_
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 69_
- •Глава 3. Типы данных, переменные и массивы 71_
- •Глава 3. Типы данных, переменные и массивы 73_
- •Глава 3. Типы данных, переменные и массивы
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы _ 77_ Эта программа генерирует следующий вывод:
- •Глава 3. Типы данных, переменные и массивы 79
- •Часть I. Язык Java
- •Глава 3. Типы данных, переменные и массивы 81_
- •Глава 4
- •Глава 4. Операции 83
- •84 Часть I. Язык Java
- •Глава 4. Операции 85_
- •Глава 4. Операции 87_
- •88_ Часть I. Язык Java
- •Глава 4. Операции 89
- •Глава 4. Операции 91_
- •Глава 4. Операции 93_
- •Глава 4. Операции 95_
- •Глава 4. Операции 97_
- •Глава 4. Операции 99
- •Глава 4. Операции 101
- •Глава 4. Операции 103
- •104 Часть I, Язык Java
- •Глава 4. Операции 105
- •Глава 5
- •Глава 5, Управляющие операторы 107
- •Глава 5. Управляющие операторы 109
- •110 Часть I. Язык Java
- •Глава 5, Управляющие операторы 111
- •Глава 5. Управляющие операторы 113
- •Глава 5. Управляющие операторы
- •Глава 5. Управляющие операторы 117
- •118 Часть I. Язык Java
- •Глава 5. Управляющие операторы 119
- •Глава 5. Управляющие операторы 121
- •122 Часть I. Язык Java
- •Глава 5. Управляющие операторы 123
- •Глава 5. Управляющие операторы 125
- •Глава 5. Управляющие операторы 127
- •Глава 5. Управляющие операторы 129
- •Глава 5. Управляющие операторы
- •Глава 6
- •134 Часть I. Язык Java
- •Глава 6. Введение в классы 135
- •136 Часть I. Язык Java
- •Глава 6. Введение в классы _ 137
- •Глава 6. Введение в классы 139
- •Глава 6. Введение в классы
- •Глава 6. Введение в классы 143
- •Глава 6. Введение в классы 145
- •Глава 6. Введение в классы 147
- •Глава 6. Введение в классы 149
- •Глава 6. Введение в классы 151
- •154 Часть I. Язык Java
- •Глава 6. Введение в классы 155
- •Глава 6. Введение в классы 157
- •Глава 7
- •Глава 7. Методы и классы 159
- •Глава 7. Методы и классы . 161
- •Глава 7. Методы и классы • 163
- •164 Часть I. Язык Java
- •Глава 7. Методы и классы 165
- •Глава 7. Методы и классы 167
- •Глава 7. Методы и классы 169
- •Глава 7, Методы и классы 171-
- •Глава 7. Методы и классы 173
- •Глава 7. Методы и классы 775
- •Глава 7. Методы и классы 177
- •Глава 7. Методы и классы ' 179
- •Глава 7. Методы и классы 1_81_
- •Глава 7. Методы и классы 1_83
- •184 '• Часть I. Язык Java
- •Глава 7. Методы и классы . 185
- •Глава 7. Методы и классы 187
- •Глава 8
- •Глава 8. Наследование 191
- •Глава 8. Наследование 193
- •Глава 8, Наследование 195
- •Глава 8. Наследование 197
- •198 Часть I. Язык Java
- •Глава 8, Наследование 199
- •Глава 8. Наследование 201
- •202 Часть I. Язык Java
- •Глава 8. Наследование 203
- •Глава 8. Наследование 205
- •Глава 8. Наследование 207
- •Глава 8. Наследование 209
- •Глава 8. Наследование 211
- •Глава 8. Наследование 213
- •Глава 8. Наследование 215
- •Глава 8. Наследование 217
- •Глава 12
- •Глава 12. Ввод/вывод, апплеты и другие темы 303_
- •Глава 12. Ввод/вывод, апплеты и другие темы . 305
- •Глава 12. Ввод/вывод, алплеты и другие темы 307
- •Глава 12. Ввод/вывод, апплеты и другие темы 309
- •Глава 12. Ввод/вывод, апплеты и другие темы 311
- •Глава 12. Ввод/вывод, апплаты и другие темы 313
- •314 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 315
- •Глава 12. Ввод/вывод, апплеты и другие темы 317
- •Глава 12. Ввод/вывод, апплеты и другие темы 319
- •320 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 321
- •Глава 12. Ввод/вывод, апплеты и другие темы 323
- •324 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплеты и другие темы 325
- •326 Часть I. Язык Java
- •Глава 12. Ввод/вывод, апплегы и другие темы 327
Глава 4. Операции 89
Так как поразрядные операции манипулируют битами в пределах целого числа, важно понять, каково воздействие таких манипуляций на его значение. В частности, полезно знать, как Java хранит целочисленные значения и как он представляет отрицательные числа. Поэтому, прежде чем продолжить, сделаем краткий обзор этих двух тем.
Все целые типы представляются двоичными числами с разным количеством разрядов. Например, целочисленное значение 42 типа byte в двоичном представлении есть 00101010, где каждая позиция представляется степенью двойки, начиная с 2° в самом правом разряде. Следующая битовая позиция (слева направо) будет представляться как 21 и т. д. (т. е. разряды нумеруются справа от 0). Двоичное представление числа 42 имеет единицы в позициях 5, 3 и 1, так что 42 есть сумма 25 + 23 + 21 или 32 + 8 + 2.
Все целые типы (кроме char) — это целые числа со знаком. Это означает, что они могут представлять как отрицательные значения, так и положительные. Java использует кодирование, известное как дополнение до двух, означающее, что отрицательные числа представляются инвертированием (заменой 1 на 0 и наоборот) всех битов в (положительном) значении с последующим прибавлением 1 к результату. Например, —42 представляется инвертированием всех битов р двоичном представлении числа 42 (т. е. в 00101010), что дает 11010101, затем прибавляется (двоичная) 1, что приводит к 11010110 (это и есть двоичное представление —42 в дополнительном коде). Чтобы декодировать отрицательное двоичное представление обратно в десятичную форму, сначала инвертируют все биты, затем преобразуют их в десятичную форму и к ней добавляют 1 (не забыв изменить знак результата). Например, инверсия 11010110 дает 00101001 (или десятичное 41), так что, если прибавить 1 и изменить знак, то получим —42.
Причину использования в Java (и большинстве других машинных языков) дополнения до двух достаточно просто проследить, если рассмотреть проблему перехода нуля. Для типа byte нулевое значение представляется как 00000000. Простое инвертирование всех битов (которое называют дополнением до единицы) дает 11111111, что формально должно создать отрицательный нуль. Неприятность в том, что такой "отрицательный нуль" недопустим в целочисленной математике (мы видим, что с учетом знакового разряда это на самом деле представление —1). Данная проблема решается следующим образом: для представления отрицательных значений используется дополнение до двух. Дополнение до двух для 00000000 вычисляется так: после поразрядной инверсии этого значения к нему добавляется (двоичная) 1, что дает 100000000. Это приводит к тому, что единичный бит выдвигается слишком далеко влево и выходит за пределы размеров byte-значения (8 бит). Поведение становится правильным, т. к. —О имеет то же двоичное значение, что +0, а 11111111 кодирует —1. Хотя в предшествующем примере мы использовали byte-значение, тот же основной принцип применяется ко всем целым типам Java.
90 Часть I. Язык Java
Из-за того, что Java использует дополнение до двух для хранения отрицательных чисел, а также потому, что в Java все целые значения — со знаками, применение поразрядных операций может легко породить неожиданные результаты. Например, включение старшего бита приведет к тому, что результирующее значение будет интерпретироваться как отрицательное число, независимо от того, входило ли это в ваши намерения или нет. Чтобы избежать неприятных сюрпризов, просто помните, что старший бит определяет знак целого числа независимо от того, как этот старший бит был установлен.
Поразрядные логические операции
Поразрядные логические операции это &, |, - и ~. Табл. 4.3 показывает результат каждой операции1. При последующем обсуждении имейте в виду, что поразрядные операции применяются к каждому индивидуальному биту в каждом операнде.
Таблица 4.3. Поразрядные логические операции Java
А в А|В А&В АЛВ ~А 0 о о о о.1 1 0 1 о 1 0 0 1 1 ' о 1 , 1 1 ' 1 1 о о |
Поразрядное отрицание
Унарная операция поразрядного отрицания (~), называемая также поразрядным дополнением, инвертирует все биты своего операнда. Например, число 42, которое представляется следующей комбинацией двоичных разрядов:
00101010
после того как применяется операция унарного отрицания, становится
11010101
Поразрядное И
Операция поразрядного И (&) производит единичный бит, если оба операнда также единичные. Во всех других случаях получается нулевой бит. Например:
' На самом деле это не одна, а несколько таблиц, называемые таблицами истинности. — Примеч. ред.