
- •1.1Система программирования java
- •1.2Выполнение Java-программы
- •1.3Программы и классы jdk
- •1.4Работа с системой программирования
- •1.4.1Работа с командной строкой
- •1.4.2Работа с интегрированной средой
- •1.5Язык программирования java
- •1.5.1 Встроенные типы данных, операции над ними
- •1.5.1.1 Комментарии
- •1.5.1.2Имена
- •1.5.1.3Примитивные типы данных и операции
- •1.5.1.4Логический тип
- •1.5.1.5 Логические операции:
- •1.5.1.6Операции над целыми типами
- •1.5.1.7Приведение типов
- •1.5.1.8 Операции сравнения
- •1.5.1.9Побитовые операции
- •1.5.1.10Сдвиги
- •1.5.1.11 Вещественные типы
- •1.5.1.12Операции присваивания
- •1.5.1.13Условная операция
- •1.5.1.14Выражения
- •1.5.1.15Приоритет операций
- •1.5.1.16Операторы
1.5.1.7Приведение типов
Результат арифметической операции имеет тип int, кроме того случая, когда один из операндов типа long . В этом случае результат будет типа long .
Перед выполнением арифметической операции всегда происходит повышение (promotion) типов byte , short , char . Они преобразуются в тип int , а может быть, и в тип long , если другой операнд типа long . Операнд типа int повышается до типа long , если другой операнд типа long . Конечно, числовое значение операнда при этом не меняется.
Это правило приводит иногда к неожиданным результатам. Попытка откомпилировать простую программу, представленную в листинге 1.3, приведет к сообщениям компилятора, показанным на рис. 1.3.
Листинг 1.3. Неверное определение переменной
class InvalidDef{
public static void main (String [] args) {
byte b1 = 50, b2 = -99;
short k = b1 + b2; // Неверно! '
System.out.println("k=" + k);
}
}
Эти сообщения означают, что в файле InvalidDef.java, в строке 4, обнаружена возможная потеря точности (possible loss of precision). Затем приводятся обнаруженный (found) и нужный (required) типы, выводится строка, в которой обнаружена (а не сделана) ошибка, и отмечается символ, при разборе которого найдена ошибка. Затем указано общее количество обнаруженных (а не сделанных) ошибок (1 error).
В таких случаях следует выполнить явное приведение типа. В данном случае это будет сужение (narrowing) типа int до типа short . Оно осуществляется операцией явного приведения, которая записывается перед приводимым значением в виде имени типа в скобках. Определение
short k = (short)(b1 + b2) ;
будет верным.
Сужение осуществляется просто отбрасыванием старших битов, что необходимо учитывать для больших значений. Например, определение
byte b = (byte) 300;
даст переменной b значение 44 . Действительно, в двоичном представлении числа 300 , равном 100101100 , отбрасывается старший бит и получается 00101100 .
Таким же образом можно произвести и явное расширение (widening) типа, если в этом есть необходимость. .
Если результат целой операции выходит за диапазон своего типа int или long , то автоматически происходит приведение по модулю, равному длине этого диапазона, и вычисления продолжаются, переполнение никак не отмечается.
1.5.1.8 Операции сравнения
В языке Java шесть обычных операций сравнения целых чисел по величине:
больше > ;
меньше < ;
больше или равно >= ;
меньше или равно <= ;
равно == ;
не равно != .
Сдвоенные символы записываются без пробелов, их нельзя переставлять местами, запись => будет неверной.
Результат сравнения — логическое значение: true , в результате, например, сравнения 3 != 5 ; или false , например, в результате сравнения 3 == 5 .
Для записи сложных сравнений следует привлекать логические.операции. Например, в вычислениях часто приходится делать проверки вида а < х < b . Подобная запись на языке Java приведет к сообщению об ошибке, поскольку первое сравнение, а < х , даст true или false , a Java не знает, больше это, чем b , или меньше. В данном случае следует написать выражение (а < х) && (х < b) , причем здесь скобки можно опустить, написать просто а < х && х < b , но об этом немного позднее.