Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Тема 1.9 Элементарные типы данных.




Типы данных в Java платформенно-независимые. Элементарных, или простых, типов всего восемь (рис. 1.33)

Рисунок 1.33 – Элементарные типы данных

Все типы исходных данных, встроенные в язык Java, разделяются на две группы: элементарные типы (primitive types) и ссылочные типы (reference types).

Ссылочные типы разделяют на массивы (arrays), классы (classes) и интерфейсы (interfaces).

В Java имеетсявосемьпростыхтипов: – byte, short, int, long, char, float, double и boolean. Их можно разделить на четыре группы:

1. Целые. К ним относятся типы – byte, short, int и long. Эти типы предназначены для целых чисел со знаком.

2. Типы с плавающей точкой – float и double. Они служат для представления чисел, имеющих дробную часть.

3. Символьный тип char. Этот тип предназначен для представления элементов из таблицы символов, например, букв или цифр.

4. Логический тип boolean. Это специальный тип, используемый для представления логических величин.

В Java, в отличие от некоторых других языков, отсутствует автоматическое приведение типов. Несовпадение типов приводит не к предупреждению при трансляции, а к сообщению об ошибке. Для каждого типа строго определены наборы допустимых значений и разрешенных операций.

Целые числа

В языке Java понятие беззнаковых чисел отсутствует. Все числовые типы этого языка – знаковые. Например, если значение переменной типа byte равно в шестнадцатиричном виде 0х80, то это – число -1.

Единственная реальная причина использования беззнаковых чисел – это использование иных, по сравнению со знаковыми числами, правил манипуляций с битами при выполнении операций сдвига. Пусть, например, требуется сдвинуть вправо битовый массив mask, хранящийся в целой переменной и избежать при этом расширения знакового разряда, заполняющего старшие биты единицами. Стандартный способ выполнения этой задачи в С – ((unsigned) mask) >> 2. В Java для этой цели введен новый оператор беззнакового сдвига вправо. Приведенная выше операция записывается с его помощью в виде mask>>>2. Детально мы обсудим все операторы далее.

Отсутствие в Java беззнаковых чисел вдвое сокращает количество целых типов. В языке имеется 4 целых типа, занимающих 1, 2, 4 и 8 байтов в памяти. Для каждого типа – byte, short, int и long, есть свои естественные области применения.

1). byte

Тип byte – это знаковый 8-битовый тип. Его диапазон – от -128 до 127. Он лучше всего подходит для хранения произвольного потока байтов, загружаемого из сети или из файла.

byte a;

byte b = 0х55;

bytec = 120;

Если речь не идет о манипуляциях с битами, использования типа byte, как правило, следует избегать. Для нормальных целых чисел, используемых в качестве счетчиков и в арифметических выражениях, гораздо лучше подходит тип int.

2). short

Short – это знаковый 16-битовый тип. Его диапазон – от -32768 до 32767. Это, вероятно, наиболее редко используемый в Java тип, поскольку он определен, как тип, в котором старший байт стоит первым.

short a;

short b = Ox55aa;

shortc = 32120;

Случилось так, что на ЭВМ различных архитектур порядок байтов в слове различается, например, старший байт в двухбайтовом целом short может храниться первым, а может и последним. Первый случай имеет место в архитектурах SPARC и Power PC, второй – для микропроцессоров Intel x86. Переносимость программ Java требует, чтобы целые значения одинаково были представлены на ЭВМ разных архитектур.

3). int

Тип int служит для представления 32-битных целых чисел со знаком. Диапазон допустимых для этого типа значений – от -2147483648 до 2147483647. Чаще всего этот тип данных используется для хранения обычных целых чисел со значениями, достигающими двух миллиардов. Этот тип прекрасно подходит для использования при обработке массивов и для счетчиков. В ближайшие годы этот тип будет прекрасно соответствовать машинным словам не только 32-битовых процессоров, но и 64-битовых с поддержкой быстрой конвейеризации для выполнения 32-битного кода в режиме совместимости. Всякий раз, когда в одном выражении фигурируют переменные типов byte, short, int и целые литералы, тип всего выражения перед завершением вычислений приводится к int.

int a;

int b = 0x55aa0000;

intc=2000000000;

4). long

Тип long предназначен для представления 64-битовых чисел со знаком. Его диапазон допустимых значений достаточно велик даже для таких задач, как подсчет числа атомов во вселенной.



long a;

long b = Ох55аа000055аа0000;

Не надо отождествлять разрядность целочисленного типа с занимаемым им количеством памяти. Исполняющий код Java может использовать для ваших переменных то количество памяти, которое сочтет нужным, лишь бы только их поведение соответствовало поведению типов, заданных вами. Фактически, нынешняя реализация Java из соображений эффективности хранит переменные типа byte и short в виде 32-битовых значений, поскольку этот размер соответствует машинному слову большинства современных компьютеров (СМ – 8 бит, 8086 – 16 бит, 80386/486 – 32 бит, Pentium – 64 бит).

Числа с плавающей точкой

Числа с плавающей точкой, часто называемые в других языках вещественными числами, используются при вычислениях, в которых требуется использование дробной части. В Java реализован стандартный (IEEE-754) набор типов для чисел с плавающей точкой – float и double и операторов для работы с ними.

1). float

В переменных с обычной, или одинарной точностью, объявляемых с помощью ключевого слова float, для хранения вещественного значения используется 32 бита.

float a;

float b = 3. 14F; // обратите внимание на F, т.к. по умолчанию все литералы double

2). double

В случае двойной точности, задаваемой с помощью ключевого слова double, для хранения значений используется 64 бита. Все трансцендентные математические функции, такие, как sin, cos, sqrt, возвращают результат типа double.

doublea;

doubleb = 3. 14159265358979323846;

К обычным вещественным числам добавляются еще три значения»:

1.Положительная бесконечность – POSITIVE_INFINITY , которая возникает при переполнении положительного значения, например, в результате операции умножения 3.0*6е307.

2. Отрицательная бесконечность – NEGATIVE_INFINITY.

3. "Не число", записываемое константой NaN (Not a Number), которое возни­кает при делении вещественного числа на нуль или умножении нуля на бесконечность.

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

Операции с бесконечностями выполняются по обычным матема­тическим правилам. Во всем остальном вещественные типы – это обычные, вещественные значения, к которым применимы все арифметические операции и сравнения, перечисленные для целых типов.

Простая программа(листинг 1.4), помогающая понять, что такое POSITIVE_INFINITY, NEGATIVE_INFINITY и NaN.

Листинг 1.4

publicclass MyFirst {

public static void main(String[] args) {

double i = 7.0;

double j, z, k;

j = i / 0;

z = -i / 0;

k = Math.sqrt(-i);

if (j == Double.POSITIVE_INFINITY) {

System.out.println("Мы получили положительную бесконечность.");

}

if (z == Double.NEGATIVE_INFINITY) {

System.out.println("Мы получили отрицательную бесконечность.");

}

if (Double.isNaN(k)) {

System.out.println("Мы получили не число.");

}

System.out.println("j=" + j + " z=" + z + " k=" + k);

}

}

Символы

Поскольку в Java для представления символов в строках используется кодировка Unicode, разрядность типа char в этом языке – 16 бит. В нем можно хранить десятки тысяч символов интернационального набора символов Unicode. Диапазон типа char – 0..65536. Unicode – это объединение десятков кодировок символов, он включает в себя латинский, греческий, арабский алфавиты, кириллицу и многие другие наборы символов.

char a;

char b = Oxf132;

char c = ' a';

char d = '\n';

Хотя величины типа char и не используются, как целые числа, вы можете оперировать с ними так, как если бы они были целыми. Это дает вам возможность сложить два символа вместе, или инкрементировать значение символьной переменной. В приведенном ниже фрагменте кода мы, располагая базовым символом, прибавляем к нему целое число, чтобы получить символьное представление нужной нам цифры.

int three = 3;

char one = '1';

char four = (char) (three+ one);

В результате выполнения этого кода в переменную four заносится символьное представление нужной нам цифры – '4'. Обратите внимание – тип переменной one в приведенном выше выражении повышается до типа int, так что перед занесением результата в переменную four приходится использовать оператор явного приведения типа.

Тип boolean

Значения логического типа boolean возникают в результате различных сравнений, вроде 2 > 3, и используются, главным образом, в условных операторах и операторах циклов. Логических значений всего два: true (истина) и false (ложь). Это служебные слова. Описание переменных этого типа выглядит так:

booleana = true;

booleanb = false;

Над логическими данными можно выполнять операции присваивания, например, bool2 = true , в том числе и составные с логическими операциями; сравнение на равенство b == bb и на неравенство b != bb, а также логические операции.

Тема 1.10 Преобразование типов.

 

Java запрещает смешивать в выражениях величины разных типов, однако при числовых операциях такое часто бывает необходимо. Различают повышающее (разрешенное, неявное) преобразование и понижающее приведение типа.

Повышающее преобразование осуществляется автоматически по следующему правилу (рис. 1.34 ). Серыми стрелками обозначены преобразования, при которых может произойти потеря точности.

Рисунок 1.34 – Преобразование типов

 

Преобразования между типами, несоединенными стрелками, неявно запрещены. Программист, проводя явное преобразование, берет ответственность за корректность преобразования на себя. Явное приведение типа имеет вид:

(целевой тип)значение

Для примера, рассмотрим программу, приведенную в листинге 1.5 .

Листинг 1.5

publicclass Conversion {

publicstaticvoid main(String[] args) {

byte b;

int i=257;

doubled=323.142;

b=(byte)i;

i=(int)d;

b=(byte)d;

}

}

 

Задание:

Модифицируйте код программы так, чтобы видеть на консоли результаты приведения типов. Прокомментируйте результаты.

Арифметические операции

К арифметическим операциям относятся:

· сложение + (плюс);

· вычитание - (дефис);

· умножение * (звездочка);

· деление / (наклонная черта – слэш);

· взятие остатка от деления (деление по модулю) % (процент);

· инкремент (увеличение на единицу) ++;

· декремент (уменьшение на единицу) --.

Между сдвоенными плюсами и минусами нельзя оставлять пробелы. Сложение, вычитание и умножение целых значений выполняются как обычно, а вот деление целых значений в результате дает опять целое (так называемое "целое деление"), например, 5/2 даст в результате 2, а не 2.5 , а 5/(-3) даст -1. Дробная часть числа попросту отбрасы­вается, происходит усечение частного, т.к. в Java принято целочисленное деление. Это странное для математики правило естественно для программирования: если оба операнда имеют один и тот же тип, то и результат имеет тот же тип. Достаточно написать 5/2.0 или 5.0/2 или 5.0/2.0 и получим 2.5 как результат деления вещественных чисел.

Операция деление по модулю определяется так:

а % b = а - (а / b) * b

Например, 5%2 даст в результате 1 , а 5% (-3) даст, 2 , т.к.

5 = (-3)*(-1) + 2 , но (-5)%3 даст -2 , поскольку -5 = 3 * (-1) - 2.

Операции инкремент и декремент означают увеличение или уменьшение значения переменной на единицу и применяются только к переменным, но не к константам или выражениям, нельзя написать 5++ или (а + b)++ .

При постфиксной первой формe записи в выражении участвует старое значение переменной и только потом происходит увеличение или уменьшение ее значения. При второй форме записи (префиксной) сначала изменится переменная, и ее новое значение будет участвовать в выражении.

Например,k=10000; (k++) + 5 даст в результате 10005 , а переменная k примет значение 10001 . Но в той же исходной ситуации (++k) + 5 даст 10006, а переменная k станет равной 10001.

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

В языке Java шесть обычных операций сравнения целых чисел по величине:

· больше >;

· меньше <;

· больше или равно >=;

· меньше или равно <=;

· равно ==;

· не равно !=.

Сдвоенные символы записываются без пробелов, их нельзя переставлять местами, запись => будет неверной.

Результат сравнения будет иметь логическое значение: true для выражения 3 != 5 ; или false , например, для 3 == 5.

Для записи сложных сравнений следует использовать логичес­кие операции. Например, в вычислениях часто приходится делать проверки вида а < х < b. Подобная запись на языке Java приведет к сообщению об ошибке, поскольку первое сравнение а<х даст true или false, a Java не знает, больше это, чем b, или меньше. В данном случае следует написать выражение (а<х) && (х<b), причем здесь скобки можно опустить, написав а<х && х<b.

Побитовые операции

Наряду с арифметическими, логическими операторами и операторами сравнения, которые используются наиболее часто, Java предоставляет также побитовые операторы, которые позволяют расширить сферу использования данного языка. Побитовые операторы могут быть применены к значениям типа long, int, short, char и byte. Над типами boolean, float и double, а также над классами эти операции выполнять нельзя. Термин "побитовые" указывает на то, что операции из данной группы используются в основном для проверки, установки и переключения отдельных разрядов числа. Эти операции чрезвычайно важны для решения задач системного программирования, в которых необходимо анализировать данные, полученные с устройства, или сформировать значения, передаваемые на устройство.

· побитовая операция AND &;

· побитовая операция OR |;

· побитовая операция XOR ^;

· сдвиг вправо >>;

· беззнаковыйсдвигвправо >>>;

· сдвиг влево<<;

· дополнение до единицы (унарная операция NOT) ~.





Рекомендуемые страницы:


Читайте также:



Последнее изменение этой страницы: 2016-05-30; Просмотров: 474; Нарушение авторского права страницы


lektsia.com 2007 - 2021 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.017 с.) Главная | Обратная связь