
- •Глава 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. Операции 93_
указанное в пшп. Для каждого сдвига влево, старший бит выходит за пределы поля значения (и теряется), а справа вводится нуль. Это означает, что, когда левый сдвиг применяется к int-операнду, биты теряются сразу же, как только они сдвигаются за 31-ю разрядную позицию. Если операнд — long, то биты выше 63-й разрядной позиции теряются.
Когда вы сдвигаете byte- и short-значения, автоматическое расширение типа в Java дает неожиданные результаты. Как вы знаете, значения byte и short раширяются до int во время вычисления (оценки) выражения. Кроме того, результат вычисления такого выражения также имеет тип int. Это означает, что результат левого сдвига на byte- или short-значении будет int и биты, сдвинутые влево, не будут потеряны, пока они не сдвинутся за последнюю 31-ю разрядную позицию. Кроме того, отрицательное byte- или short-значение при расширении до int будет расширено своей знаковой позицией, т. е. его старшие биты будут заполнены единицами. Выполнение левого сдвига в значениях до byte или short подразумевает, что следует отбросить старшие байты int-результата. Например, если сдвигается влево byte-значение, то оно будет сначала расширено до int и затем сдвинуто. Далее, если нужно сохранить byte-тип результата, следует отбросить три верхних байта результата. Проще всего это выполняется с помощью явного приведения типа результата обратно в byte. Эту концепцию демонстрирует следующая программа:
// Левый сдвиг byte-значения, class ByteShift {
public static void main(String args [ ]) {
byte a = 64, b;
int i ;
i = a « 2;
b = (byte) (a « 2) ; // явное приведение типа в byte
System.out.println("Исходное значение а: " + a); System.out.println("i и b: " + i + " " + b); } ) '
Вывод, сгенерированный этой программой: !
Исходное значение а: 64 i и Ь: 256 О
Так как переменная а расширяется до int с целью вычислений, двойной левый сдвиг значения 64 (0100 0000) приводит к тому, что переменная i содержит значение 256 (1 0000 0000). Однако значение в переменной ь содержит 0, потому что после сдвига младший байт становится нулевым, а его единственный единичный бит был выдвинут из поля хранения bite-значения.
94 • Часть I. Язык Java
Так как каждый левый сдвиг имеет эффект удвоения первоначального значения, программисты часто используют этот факт как эффективную альтернативу умножению на 2. Но следует соблюдать осторожность: если вы сдвинете бит со значением 1 в самую старшую позицию (бит 31 или 63), то значение станет отрицательным. Следующая программа иллюстрирует это положение:
// Левый сдвиг, как быстрый способ умножения на 2. class MultByTwo {
public static void main(String args [ ]) {
int i ;
int num = OxFFFFFFE;
for(i=0; i<4; i++) { num = num « 1; System.out.println(num); } } }
Программа генерирует следующий вывод:
536870908 1073741816 2147483632 -32
Начальное значение было выбрано так, чтобы после смещения влево на 4 позиции был получен результат -32. Видно, когда единичный бит сдвинулся в позицию 31, число стало интерпретироваться как отрицательное.
Правый сдвиг
Операция правого сдвига (») сдвигает все биты значения вправо на указанное количество разрядов. Ее общая форма:
value » пшп
Здесь num определяет число позиций правого сдвига в значении value. To есть » передвигает все биты в указанном значении вправо на число разрядных позиций, указанных в num.
Следующий кодовый фрагмент сдвигает значение 32 вправо на две позиции, приводя это значение к числу 8:
int a = 32;
а = а » 2; // теперь содержит 8