Урок 2

Примитивные типы


1. Общая информация

Типы в Java распределены на две категории: примитивные (простые) и ссылочные (объектные). Ссылочные типы - это массивы, классы и интерфейсы. 

Типы данных в Java

В этом разделе мы рассмотрим примитивные типы. Простые типы в Java предопределены заранее и поименованы зарезервированными словами (keywords).

Примитивные типы можно разделить на следующие четыре группы:

  1. Целые числа. Эта группа включает в себя типы данных byte, short, int и long, представляющие целые числа со знаком.

  2. Числа с плавающей точкой. Эта группа включает в себя типы данных flоаt и double, представляющие числа с точностью до определенного знака после десятичной точки.

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

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

Следующая таблица содержит информацию о длине, диапазоне допустимых значений и значения по умолчанию примитивных типов:

Тип Размер в байтах Размер в битах Возможные значения (от..до) Значение по умолчанию
boolean 1 true или false false
byte -128..127 0
short 16  -32,768..32,767 0
int 4 32  -2,147,483,648..2,147,483,647 0
long 8 64 -9,223,372,036,854,775,808..9,223,372,036,854,775,807 0
char 2 16 0..65,535 '\u0000'
float 4 32 -3.4E+38..3.4E+38 (стандарт IEEE 754) 0.0
double 8 64 -1.7E+308..1.7E+308 (стандарт IEEE 754) 0.0

2. Целочисленные типы

int — основной целочисленный тип, используемый в Java по умолчанию. Любое целое число будет рассматриваться компилятором как число типа int. Используется в качестве счётчика циклов, индексов массивов и индексов символов в строках.

long — целочисленный тип содержащий практически бесконечное количество значений. Используется в случаях, где числа превосходят 2 миллиарда и стандартного int уже не хватает. Используется в повседневной жизни для создания уникальных значений.

byte — используется для передачи данных по сети, записи и чтения из файла. В математических операциях, как правило, не используется.

short — самый редко используемый тип в Java, может использоваться только в целях экономии памяти.

Пример 1. Объявление целочисленных типов

byte b = 4;
short s1 = 7, s2 = 5;
int i1 = 56, i2;
i2 = 78;
long a1 = 456;

3. Типы с плавающей точкой

Числа с плавающей точкой (или действительные числа) представлены типами float и double. Используются для хранения значений с точностью до определенного знака после десятичной точки. Для

double — это числа с двойной точностью, максимально приближённые к заданным или полученным в результате вычислений значениям. Используется в Java для любых математических вычислений (квадратный корень, синус, косинус,..).

float — менее точный тип с плавающей точкой. Используется очень редко с целью экономии памяти.

Пример 2. Объявление типов с плавающей точкой

double d1 = 3.45;
float f1 = 34.456f;

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

  • положительная бесконечность - результат деления положительного числа на 0. Представлены константами Double.POSITIVE_INFINITY и Float.POSITIVE_INFINITY.
  • отрицательная бесконечность результат деления отрицательного числа на 0. Представлены константами Double.NEGATIVE_INFINITY и Float.NEGATIVE_INFINITY.
  • NaN (не число) - вычисление 0/0 или извлечение квадратного корня из отрицательного числа. Представлены константами Double.NaN и Float.NAN.

Пример 3. Использование специальных чисел с плавающей точкой в арифметических выражениях

public class Main {
    public static void main(String[] args) {
        int a = 7;
        double b = 0.0;
        double c = -0.0;
        double g = Double.NEGATIVE_INFINITY;

        System.out.println(a / b);
        System.out.println(a / c);
        System.out.println(b == c);
        System.out.println(g * 0);
    }
}

Числа с плавающей точкой нельзя использовать в финансовых расчетах, где ошибки округления недопустимы. Например, в результате выполнения оператора System.out. println(2.0 - 1.1) будет выведено значение 0.8999999999999999, а не 0.9, как было бы логично предположить. Подобные ошибки связаны с внутренним двоичным представлением чисел. Как в десятичной системе счисления нельзя точно представить результат деления 1/3, так и в двоичной системе невозможно точно представить результат деления 1/10. Если же требуется исключить ошибки округления, то следует воспользоваться классом BigDecimal.

4. Символьный тип

char — используется для представления символов. Символы преобразуются по таблице кодировки UTF-16. По большому счёту это все буквы, числа и специальные символы существующие на нашей планете. Каждому символу соответствует определённое число из таблицы и Java при виде этого числа в рамках типа char выводит его на экран как символ.

Пример 4. Объявление символьных типов

char c1 = 'a';
char c2 = 45;

5. Логический тип

Примитивный тип boolean предназначен для хранения логических значений. Переменные этого типа могут принимать только два значения: true – истина и false – ложь. Памяти на переменную такого типа требуется 1 бит.

Пример 5. Объявление логических типов

boolean b1 = false;
boolean b2 = true;

6. Хранение целочисленных чисел в памяти

Двоичное представление значения типа byte в памяти:

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

Старший бит в целых числах со знаком используется для обозначения знака. Для положительных чисел он всегда равен 0. В отрицательных числах старший бит всегда равен 1. Такая запись числа в двоичной системе счисления называется прямой код.

Таким образом, в двоичной системе счисления, используя прямой код, в восьмиразрядной ячейке (байте) можно записать семиразрядное число. Например:

0 0001101 – положительное число
1 0001101 – отрицательное число

При этом в вычислительной технике прямой код используется почти исключительно для представления положительных чисел.

Для отрицательных чисел используется так называемый дополнительный код. Это связано с удобством выполнения операций над числами электронными устройствами компьютера.

Для перевода отрицательного числа в дополнительный код используется следующий алгоритм:

    1. Все разряды числа (кроме первого разряда) инвертируются, т.е. заменяются противоположными (0 на 1, а 1 на 0). Например, если 1 0001100 – это прямой код числа, то при формировании его дополнительного кода, сначала надо заменить нули на единицы, а единицы на нули, кроме первого разряда. Получаем 1 1110011.
    2. Далее следует прибавить единицу к получившемуся инверсией числу:
      1 1110011 + 1 = 1 1110100

 

Источники: 

1. http://blog.kademika.com/2015/04/23/primitives/

2. http://inf1.info/additionalcode



0 comments
Leave your comment: