Примитивные типы данных и диапазоны Java

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

1. Примитивные типы Java

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

Давайте рассмотрим каждый примитивный тип данных на изображении ниже.

Примитивные типы данных в Java
Примитивные типы данных в Java
Примитивный тип Размер памяти Значение по умолчанию Диапазон
булев 8 бит ЛОЖЬ правда или ложь
байт 8 бит, целое число со знаком 0 -128 до 127 включительно
чар 16 бит, символ Unicode \u0000 или кодовая точка 0 0 до 65535
короткий 16 бит, целое число со знаком 0 -32,768 до 32,767 включительно
инт 32 бита, целое число со знаком 0 -231 до 231– 1
длинный 64 бита, целое число со знаком 0 -263 до 263 – 1
плавать 32 бита, IEEE 754, значение с плавающей точкой 0.0 1.4E-45 до 3.4028235e38(6-7 значащих десятичных знаков)
двойной 64 бит, IEEE 754 0.0 4.9E-324 до 1.7976931348623157e308(15 значащих десятичных знаков)

2. Булевы типы

Тип данных boolean имеет только два допустимых значения: true и false. Эти два значения называются boolean литералами. Мы можем использовать boolean литералы в следующем примере.

boolean done; // Declares a boolean variable named donedone = true; // Assigns true to done//orboolean done = true; //Declare and assign in the same line

Важно отметить, что булевская переменная не может быть приведена к какому-либо другому типу данных и наоборот. Java не определяет размер булевого типа данных. Его размер остается на усмотрение реализации JVM. Обычно значение булевого типа данных хранится внутри в байте.

3. Интегральные типы Java

Целочисленный тип данных — это числовой тип данных, значения которого имеют целочисленный тип. Java предлагает пять целочисленных типов. Целочисленные типы потребляют следующий объем памяти:

3.1. байт

  • Тип данных byte представляет собой 8-битный знаковый примитивный целочисленный тип данных Java.
  • Диапазон значений составляет от -128 до 127. Это наименьший целочисленный тип данных, доступный в Java.
  • В отличие от литералов int и long, байтовых литералов нет.
  • Однако вы можете присвоить любой литерал типа int, попадающий в диапазон байтов, переменной типа byte.
byte b1 = 125;byte b2 = -11;

Если вы присваиваете int-литерал переменной byte и значение выходит за пределы диапазона типа данных byte, Java генерирует ошибку компиляции. Следующий фрагмент кода вызовет ошибку компиляции:

// An error. 150 is an int literal outside -128 to 127byte b = 150;

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

byte b =(byte) num; // Ok

3.2. короткий

  • Тип данных short — это 16-битный знаковый примитивный целочисленный тип данных Java. Диапазон значений — от -32768 до 32767.
  • В отличие от int и длинных литералов, короткого литерала не существует.
  • Однако вы можете присвоить любой литерал int, попадающий в диапазон short(от -32768 до 32767), переменной short.
short s1 = 12905; // okshort s2 = -11890; // ok

Значение переменной byte всегда может быть присвоено переменной short, поскольку диапазон типа данных byte попадает в диапазон типа данных short. Все остальные правила присвоения значения из переменной int или long переменной short такие же, как и для переменной byte.

3.3. чар

  • Тип данных char — это 16-битный беззнаковый примитивный тип данных Java.
  • Он представляет собой символ Unicode.
  • Обратите внимание, что char — это тип данных без знака. Поэтому переменная char не может иметь отрицательное значение.
  • Диапазон значений типа данных char составляет от 0 до 65535, что совпадает с диапазоном значений набора Unicode.
  • Символьный литерал представляет значение типа данных char.
char c1 = 'A';char c2 = 'L';char c3 = '5';char c4 = '/';

Символьный литерал также может быть выражен как escape-последовательность символов. Escape-последовательность символов начинается с обратной косой черты, за которой сразу следует символ, и оба заключаются в одинарные кавычки.

Существует восемь предопределенных последовательностей символов, перечисленных ниже:

Последовательность выхода из персонажа Описание
'\н' Перевод строки
'\р' Возврат каретки
'\ф' Форма подачи
'\б' Возврат на одну позицию
'\т' Вкладка
'\\' Обратная косая черта
'\»' Двойная кавычка
'\» Одна цитата

Это всего лишь восьмисимвольные escape-последовательности в Java. Вы не можете определить свои собственные escape-последовательности символов.

Символьный литерал также может быть выражен как escape-последовательность Unicode в форме '\uxxxx'. Здесь \u(обратная косая черта, за которой сразу следует строчная буква u) обозначает начало escape-последовательности Unicode, а xxxx представляет собой ровно четыре шестнадцатеричные цифры.

char c1 = 'A';char c2 = '\u0041'; // Same as c2 = 'A'

3.4.инт

  • Тип данных int — это 32-битный знаковый примитивный тип данных Java. Переменная типа данных int занимает 32 бита памяти.
  • Допустимый диапазон: от -2 147 483 648 до 2 147 483 647(от -231 до 231– 1).
  • Все целые числа в этом диапазоне известны как целочисленные литералы(или целочисленные константы). Например, 10, -200, 0, 30, 19 и т. д. являются целочисленными литералами int.

Целочисленный литерал можно присвоить переменной типа int, например, counter, следующим образом:

int counter = 21;

В Java есть класс-оболочка Integer, который определяет две константы для представления максимальных и минимальных значений для типа данных int, Integer.MAX_VALUE и Integer.MIN_VALUE. Это объектное представление значения int.

int max = Integer.MAX_VALUE; // Assigns maximum int value to maxint min = Integer.MIN_VALUE; // Assigns minimum int value to min

3.5. длинный

  • Тип данных Long представляет собой 64-битный знаковый примитивный тип данных Java.
  • Используется, когда результат вычислений над целыми числами может выйти за пределы диапазона типа данных int.
  • Диапазон значений: от -263 до 263 – 1.
  • Все целые числа в диапазоне long называются целыми литералами типа long.

Целочисленный литерал типа long всегда заканчивается на «L»(или строчную букву «l»).

long num1 = 0L;long num2 = 401L;long mum3 = -3556L;

Даже если значение, хранящееся в переменной long, находится в пределах диапазона типа данных int, присвоение значения из long в int не допускается без явного приведения типа, как показано в следующем примере:

int num1 = 5;long num2 = 25L;// A compile-time error. Even if num2's value 25 which is within the range of int.num1 = num2;

Если вы хотите присвоить значение переменной long переменной int, вам нужно явно упомянуть этот факт в вашем коде, чтобы Java убедилась, что вы знаете о возможном переполнении данных. Вы делаете это с помощью «cast» в Java, например так:

long num1 =(int) num2; // Now it is fine because of the "(int)" cast

Записывая(int)num2, вы указываете Java обрабатывать значение, хранящееся в num2, как int. Во время выполнения Java будет использовать только 32 младших бита num2 и присваивать значение, хранящееся в этих 32 битах, num1. Если num2 имеет значение, выходящее за пределы диапазона типа данных int, вы не получите то же значение в num1, и это приведет к потере данных.

В Java есть класс Long(обратите внимание на заглавную букву L в слове Long), который определяет две константы для представления максимального и минимального значений типа данных long, Long.MAX_VALUE и Long.MIN_VALUE.

long max = Long.MAX_VALUE;long min = Long.MIN_VALUE;

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

Число с плавающей запятой, содержащее дробную часть, называется действительным числом, например, 3,25, 0,49, -9,19 и т. д.

4.1. Как числа хранятся в памяти?

Когда действительное число преобразуется в его двоичное представление, компьютер также должен сохранить положение десятичной точки в числе. Существует две стратегии сохранения действительного числа в памяти компьютера.

  1. Формат чисел «с фиксированной точкой» — хранить только двоичное представление числа и предполагать, что до и после точки всегда есть фиксированное количество цифр. Точка называется десятичной точкой в десятичном представлении числа и двоичной точкой в двоичном представлении. Тип представления, в котором положение точки в числе всегда фиксировано, называется форматом чисел «с фиксированной точкой».
  2. Формат чисел «с плавающей точкой» — Сохраните двоичное представление вещественного числа и положение точки в вещественном числе. Поскольку количество цифр до и после точки может меняться в этом виде представления вещественного числа, мы говорим, что точка может плавать. Такой вид представления называется форматом «с плавающей точкой».

Представления с плавающей точкой медленнее и менее точны по сравнению с представлениями с фиксированной точкой. Однако представления с плавающей точкой могут обрабатывать больший диапазон чисел с той же памятью компьютера по сравнению с представлениями с фиксированной точкой.

Java поддерживает формат чисел с плавающей точкой.

Числа с плавающей точкой
IEEE-754 32-битные числа с плавающей точкой одинарной точности

В Java имеется два числовых типа данных с плавающей точкой:

  • плавать
  • двойной

4.2. поплавок

Тип данных float использует 32 бита для хранения числа с плавающей точкой в стандартном формате IEEE 754(число с плавающей точкой одинарной точности). Он может представлять действительное число от 1,4 x 10-45 до 3,4 x 1038(приблизительно) по величине. Диапазон включает только величину. Она может быть положительной или отрицательной.

Все действительные числа, заканчивающиеся на «f» или «F», называются плавающими литералами.

float f1 = 8F;float f2 = 8.F;float f3 = 8.0F;

Тип данных float определяет две бесконечности: положительную бесконечность и отрицательную бесконечность. Например, результатом деления 2.5F на 0.0F является float положительная бесконечность, тогда как результатом деления 2.5F на -0.0F является float отрицательная бесконечность.

Результаты некоторых операций над float не определены. Эти результаты представлены значением типа float NaN(Not-a-Number).

Класс Float определяет три константы, которые представляют положительную бесконечность, отрицательную бесконечность и NaN типа данных float. Есть еще две константы, которые представляют максимальное и минимальное(больше нуля) значения float, которые могут быть сохранены в переменной float.

Float.POSITIVE_INFINITY - Positive infinity of type float.Float.NEGATIVE_INFINITY - Negative infinity of type float.Float.NaN - Not a Number of type float.Float.MAX_VALUE - The largest positive value that can be represented in a float variable.Float.MIN_VALUE - The smallest positive value greater than zero that can be represented in a float variable.

Обратите внимание, что значение всех целочисленных типов(int, long, byte, short и char) может быть присвоено переменной типа данных float без использования явного приведения, НО значение float должно быть приведено до того, как оно будет присвоено переменной любого целочисленного типа данных int, long, byte, short или char.

4.3. двойной

Тип данных double использует 64 бита для хранения числа с плавающей точкой в «стандартном формате IEEE 754». Число с плавающей точкой, представленное в 64 битах в соответствии со стандартом IEEE 754, также известно как число с плавающей точкой двойной точности.

Все действительные числа называются двойными литералами. Двойной литерал может необязательно заканчиваться на «d» или «D», например, 19.27d. Однако суффикс d или D является необязательным в двойных литералах. То есть, и 19.27, и 19.27d представляют один и тот же двойной литерал.

double d1 = 8Ddouble d2 = 8.;double d3 = 8.0;double d4 = 8.D;

Как и тип данных float, тип данных double определяет максимальное, минимальное, две бесконечности и NaN-значения.

Double.POSITIVE_INFINITY - Positive infinity of type double.Double.NEGATIVE_INFINITY - Negative infinity of type double.Double.NaN - Not a Number of type double.Double.MAX_VALUE - The largest positive value that can be represented in a double variable.Double.MIN_VALUE - The smallest positive value greater than zero that can be represented in a double variable.

5. Заключение

В этой статье мы подробно изучили примитивные типы и их диапазоны. Некоторые научные или криптографические приложения требуют от нас хранения и обработки очень больших(или очень маленьких) чисел и ценят точность выше производительности. Если нам нужны числа больше, чем предлагают примитивные типы, мы можем использовать классы BigInteger и BigDecimal в пакете java.Math. Эти классы предлагают почти бесконечный размер или точность.

Прокрутить вверх