Операции над примитивными типами в java

long и int в Java

Значения для типов int и long могут быть выражены как целые числа с основанием 10, используя обычную позиционную запись:

int number= 42;

или в шестнадцатеричном представлении (Hex, base 16) с использованием суффикса ‘0x’ или двоичном (base 2, из версии 7 java) с использованием суффикса ‘0b’:

int number= 0x2A;      // шестнадцатеричный   
int number= 0b00101010;// двоичный

Эти же литералы могут также использоваться для выражения байтовых и коротких значений, в то время как для выражения длинных значений используется буква ‘L’ (строчный символ также допустим, но не рекомендуется из-за его плохой читаемости, так как его можно спутать с числом ‘1’):

long bigLUE = 4242424242L;

2.1 Целочисленные типы (Integral types)

Integer-типы и тип char все вместе называются integral-типами.

2.1.1 Символьный тип char

Тип char является беззнаковым. Его значения это беззнаковые целые, которые обозначают все 65536 (216) символов из 16-битной Unicode таблицы символов. Эта таблица включает буквы, цифры и специальные символы.

Диапазон символьных значений

Первые 128 символов Unicode-таблицы такие же как и в 7-битной ASCII таблице символов. А первые 256 символов Unicode-таблицы такие же как и в 8-битной ISO Latin-1 таблице символов.
Символьный литерал заключается в одинарные кавычки (‘). Все символьные литералы имеют примитивный тип данных char. Символьный литерал представляется в соответствии с 16-битной символьной таблицей Unicode, которая включает в себя символы 8-битной ISO-Latin-1 и 7-битной ASCII

Обратите внимание, что цифры (0-9), прописные буквы (A-Z) и строчные буквы (a-z) имеют Unicode значения расположенные соответственно их порядку

Примеры символьных литералов

Unicode символ может быть указан как четырехзначное шестнадцатеричное число (т.е. 16-бит) с префиксом \u.Escape-последовательности (escape sequences) определяются специальные символы. Для определения символьного литерала они должны быть заключены в одинарные кавычки. Например, символьные литералы \t и \u0009 являются эквивалентными. Однако символьные литералы \u000a и \u000d не должны использоваться в исходном коде для представления новой строки и возврата каретки. Компилятор интерпретирует эти значения как терминаторы строк, что вызовет ошибку компиляции. Вам следует использовать escape-последовательности \n и \r для правильной интерпретации этих символов в коде.

Вы также можете использовать escape-последовательность \ddd чтобы указывать символьный литерал как восьмеричное значение, где вместо каждой d может быть восьмеричная цифра (0–7). Количество цифр должно быть три или меньше и восьмеричное значение не должно превышать \377; другими словами только первые 256 символов могут быть указаны в такой нотации.

Примеры \ddd escape-последовательностей

2.1.2 Целые типы (integer types): byte, short, int, long

Целые типы данных (Integer data types) охватывают следующие типы данных:  int, long, byte и short. Типы byte, short, int, long являются знаковыми.
Примитивные значения данных не являются объектами. Каждый примитивный тип данных определяет диапазон значений и операции над этими значениями с помощью операторов. Каждый примитивный тип данных имеет соответствующий ему класс-обертку (wrapper), который может быть использован для представления значения в форме объекта.

Диапазон целых значений

По умолчанию для любого целочисленного литерала используется тип int. Но если добавить к целочисленному значению суффикс L (или l), то будет использоваться тип long. Обычно используют суффикс L потому что l похож на единицу, что может вызвать путаницу. Без суффикса L long-литералы 2000L и 0L будут интерпретированы как int-литералы. Не существует прямого способа чтобы указать short и byte литерал.

В дополнение целочисленные литералы могут быть указаны не только в десятичной системе счисления, но в двоичной (основание 2, цифры 0-1), восьмеричной (основание 8, цифры 0-7) и шестнадцатеричной (основание 16, цифры 0-9 и a-f). Цифры от a до f в шестнадцатеричной системе счисления соответствуют числам от 10 до 15. Двоичные, восьмеричные и шестнадцатеричные числа указываются с префиксами оснований 0b (или 0B), 0, и 0x (или 0X) соответственно. Шестнадцатеричные цифры от a до f также могут указываться в верхнем регистре (A-F). Негативные целые (например, -90) указываются с минусом (-) в виде префикса независимо от системы счисления (например, -0b1011010, -0132, или -0X5A).

Примеры десятичных, бинарных, восьмеричных и шестнадцатеричных литералов

Тип double

Для работы с вещественными (дробными) числами в Java используется тип . В памяти он занимает (в два раза больше, чем тип ) и может хранить значения в диапазоне до . Для сравнения: тип может хранить значение в диапазоне до .

В вещественных числах дробная часть записывается после точки. Например, 123.456, или 2.5, или 100.00 или 0.01. Такие числа еще называют числами с плавающей точкой — floating point number – компьютерное название для вещественных чисел.

Кстати, кроме типа есть еще вещественный тип (размером всего 4 байта). Его название как раз и происходит от floating point. Название же происходит от double float. Тип в два раза больше, чем : против . Его еще называют вещественное число двойной точности.

Класс Double

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

Интересных полей у класса шесть:

Поле Описание
Минус бесконечность
Плюс бесконечность
Минимальное значение экспоненты (2x)
Максимальное значение экспоненты (2x)
Минимальное значение типа
Максимальное значение типа

Бесконечность

Если вы разделите на , получите отрицательную бесконечность, если на — положительную бесконечность. Тип может не только делить на ноль, но и хранить такие значения.

Экспонента числа

С экспонентой тоже все просто. Число double внутри состоит из мантисы и экспоненты. Только вот значение экспоненты — это не , а . Если экспонента вырастет на , итоговое значение числа станет больше в два раза.

, в итоге получаем примерно равно

Также у класса есть интересные методы:

Методы Описание
Возвращает строку — шестнадцатеричное представление числа
Проверяет, является ли переданное число бесконечностью.
Проверяет, является ли переданное число
Оборачивает переданный в
Возвращает число, полученное из строки

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

Аналогично работает и метод — проверяет, является ли переданное в него число : специальная константа, обозначающая неопределенность (Not a Number, Не число).

Default Values

It’s not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or , depending on the data type. Relying on such default values, however, is generally considered bad programming style.

The following chart summarizes the default values for the above data types.

Data Type Default Value (for fields)
byte
short
int
long 0L
float 0.0f
double 0.0d
char ‘\u0000’
String (or any object)   null
boolean false

Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error.

Literals

You may have noticed that the keyword isn’t used when initializing a variable of a primitive type. Primitive types are special data types built into the language; they are not objects created from a class. A literal is the source code representation of a fixed value; literals are represented directly in your code without requiring computation. As shown below, it’s possible to assign a literal to a variable of a primitive type:

boolean result = true;
char capitalC = 'C';
byte b = 100;
short s = 10000;
int i = 100000;

Integer Literals

An integer literal is of type if it ends with the letter or ; otherwise it is of type . It is recommended that you use the upper case letter because the lower case letter is hard to distinguish from the digit .

Values of the integral types , , , and can be created from literals. Values of type that exceed the range of can be created from literals. Integer literals can be expressed by these number systems:

  • Decimal: Base 10, whose digits consists of the numbers 0 through 9; this is the number system you use every day
  • Hexadecimal: Base 16, whose digits consist of the numbers 0 through 9 and the letters A through F
  • Binary: Base 2, whose digits consists of the numbers 0 and 1 (you can create binary literals in Java SE 7 and later)

For general-purpose programming, the decimal system is likely to be the only number system you’ll ever use. However, if you need to use another number system, the following example shows the correct syntax. The prefix indicates hexadecimal and indicates binary:

// The number 26, in decimal
int decVal = 26;
//  The number 26, in hexadecimal
int hexVal = 0x1a;
// The number 26, in binary
int binVal = 0b11010;

Floating-Point Literals

A floating-point literal is of type if it ends with the letter or ; otherwise its type is and it can optionally end with the letter or .

The floating point types ( and ) can also be expressed using E or e (for scientific notation), F or f (32-bit float literal) and D or d (64-bit double literal; this is the default and by convention is omitted).

double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

Character and String Literals

Literals of types and may contain any Unicode (UTF-16) characters. If your editor and file system allow it, you can use such characters directly in your code. If not, you can use a «Unicode escape» such as (capital C with circumflex), or (Sí Señor in Spanish). Always use ‘single quotes’ for literals and «double quotes» for literals. Unicode escape sequences may be used elsewhere in a program (such as in field names, for example), not just in or literals.

The Java programming language also supports a few special escape sequences for and literals: (backspace), (tab), (line feed), (form feed), (carriage return), (double quote), (single quote), and (backslash).

There’s also a special literal that can be used as a value for any reference type. may be assigned to any variable, except variables of primitive types. There’s little you can do with a value beyond testing for its presence. Therefore, is often used in programs as a marker to indicate that some object is unavailable.

Finally, there’s also a special kind of literal called a class literal, formed by taking a type name and appending «; for example, . This refers to the object (of type ) that represents the type itself.

JSON

Сериализация и Десериализация

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

Прим. перев. Для использования JSON из примера необходимо подключить библиотеку JSON Simple.

Вы можете сериализовать данные следующим образом:

Получается следующая строка JSON:

Десериализация в Java выглядит так:

Используемый в примере файл JSON (jsonDemoFile.json):

Прим. перев. В Java проектах очень часто для работы с JSON используют библиотеки Gson от Google или Jackson. Обе библиотеки очень популярны и хорошо поддерживаются. Попробуйте и их.

Вычисление целочисленных выражений

В правой части от оператора присваивания (знака равенства) может быть любое выражение — комбинация чисел, переменных и знаков , , , .

Также можно использовать скобки . В Java, как и в математике, сначала вычисляются выражения внутри скобок, а затем — вовне.

Умножение и деление имеют равный приоритет, и он выше, чем у сложения и вычитания.

Примеры:

Команда Примечание
В переменной будет значение
В переменной будет значение
В переменной будет значение
При выполнении этой команды возникнет ошибка «деление на ноль», и программа завершится.

Также в выражении могут участвовать переменные:

Команда Примечание
В переменной  будет значение
В переменной  будет значение
В переменной  будет значение

Более того, одна и та же переменная может одновременно быть слева и справа от оператора присваивания:

Команда Примечание
В переменной  будет значение
В переменной  будет значение
В переменной  будет значение
В переменной  будет значение
В переменной  будет значение
В переменной  будет значение

Все дело в том, что в языке Java символ – это не обозначение равенства, а команда, которая в переменную слева от знака заносит вычисленное значение выражения справа от знака .

Через DecimalFormat

DecimalFormat — это конкретный подкласс класса NumberFormat, который форматирует десятичные числа. Он имеет множество функций, предназначенных для анализа и форматирования чисел. Вы можете использовать его для форматирования числа в строковое представление по определенному шаблону.

Пример

import java.text.DecimalFormat;
public class Method4
{
	 public static void main(String[] args) 
	 {
	      int number = 12345;
	      DecimalFormat numberFormat = new DecimalFormat("##,###");
	      String str = numberFormat.format(12345);	      
          System.out.println("The number to be converted is: " + number);
	      System.out.println("The string version of 12345 is: " + str);
	 }
	 
}

Вывод

The number to be converted is: 12345
The string version of 12345 is: 12,345

Если вы знаете, как использовать метод DecimalFormat, это лучший вариант для преобразования Integer в String из-за уровня контроля, который можете иметь при форматировании. Можете указать количество знаков после запятой и разделитель запятых для лучшей читаемости, как показано в примере выше.

Строки

Оптимизация строки

Для конкатенации (сложения) строк в Java используется оператор «+», для примера, в цикле новый объект может создаваться для каждой новой строки, что приводит к потере памяти и увеличению времени работы программы.

Необходимо избегать создания Java строк через конструктор, пример:

Одинарные и двойные кавычки

Что ты ожидаешь в результате выполнения этого кода?

Казалось бы, строка должна возвращать «HaHa», но на самом деле это будет «Ha169».

Двойные кавычки обрабатывают символы как строки, но одинарные кавычки ведут себя иначе. Они преобразуют символьные операнды ( и ) в целые значения посредством расширения примитивных типов — получается 169.

Сужение типов

А что насчет остальных вариантов? Что делать, если нужно переменной типа присвоить значение переменной типа ?

Представьте, что переменная — это корзина. У нас есть корзины разных размеров: 1, 2, 4 и 8 байт. При перекладывании пирожков из меньшей корзины в большую проблем не будет. А вот при перекладывании из большей в меньшую часть пирожков может потеряться.

Это преобразование — от типа большего размера к меньшему — называют сужением типа. При таком присваивании часть числа может просто не поместиться в новую переменную и «остаться за бортом».

При сужении типа мы должны явно показать компилятору, что мы не ошиблись, и отбрасывание части числа сделано осознанно. Для этого используется оператор приведения типа. Это имя типа в круглых скобочках.

В таких ситуациях Java-компилятор требует от программиста указывать оператор преобразования типа. Выглядит в общем виде он так:

Примеры:

Код Описание
Каждый раз нужно явно указывать оператор преобразования типа

В данном случае равно , и это кажется излишним. А что если бы было больше?

Код Описание

Миллион отлично помещается и в тип , и в тип . А вот при присваивании миллиона переменной типа два первых байта были отброшены, и остались только два последних байта. А при присваивании типу вообще остался один последний байт.

Устройство чисел в памяти:

Тип Двоичная запись Десятичная запись
0b00000000000011110100001001000000
0b0100001001000000
0b01000000

Тип

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

В нельзя сохранить отрицательные числа, которые могут храниться в . А в нельзя сохранить числа больше , которые могут храниться в .

Как работают Generics

На самом деле Generics работают до ужаса примитивно.

Компилятор просто заменяет тип с параметром на него же, только без параметра. А при взаимодействии с его методами добавляет операцию приведения типа к типу-параметру:

Код Что сделает компилятор

Допустим, у нас был код метода, который суммирует числа в коллекции целых чисел:

Код Что сделает компилятор

Т.е. по сути дженерики — это такая разновидность синтаксического сахара, как и autoboxing, только побольше. При autoboxing компилятор за нас добавляет методы для преобразования типа к и обратно, а для generics добавляет операторы приведения типа.

После того, как компилятор скомпилировал ваш код с дженериками, в нем все классы с параметрами были преобразованы просто в классы и операторы приведения типа. Информация о том, какие изначально были типы-параметры у переменных сложных типов, потерялась. Этот эффект еще называют стиранием типов.

Иногда программистам, которые пишут свои классы с типами-параметрами, очень нехватает информации о типах, которые туда передаются в качестве параметров. Как с этим борются и что из этого выходит, вы узнаете в квесте Java Collections.

Присваивание целых и вещественных чисел

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

Во-первых, переменным типа можно присваивать как вещественные, так и целые числа. При присваивании целых чисел они просто преобразовываются в вещественные. Хотя иногда при этом возможна небольшая потеря точности.

Команда Примечание
В переменной хранится значение
В переменной хранится значение
В переменной хранится значение

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

Команда Примечание
В переменной хранится значение
На экран будет выведено число
На экран будет выведено число

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

Также компилятор требует, чтобы этот факт программист задокументировал явно (чтобы другие программисты понимали, что тут происходит отбрасывание дробной части). Общий вид этого выражения в коде такой:

Присваивание переменной типа вещественного числа

Примеры:

Команда Примечание
В переменной хранится значение
В переменной хранится значение
В переменной хранится значение

Числовые типы данных

Тип данных Объем памяти Диапазон Описание
TINYINT (M) 1 байт от -128 до 127 или от 0 до 255 Целое число. Может быть объявлено положительным с помощью ключевого слова UNSIGNED, тогда элементам столбца нельзя будет
присвоить отрицательное значение. Необязательный параметр М — количество отводимых под число символов. Необязательный
атрибут ZEROFILL позволяет свободные позиции по умолчанию заполнить нулями.Примеры:
TINYINT — хранит любое число в диапазоне от -128 до 127.
TINYINT UNSIGNED — хранит любое число в диапазоне от 0 до 255.
TINYINT (2) — предполагается, что значения будут двузначными, но по факту будет хранить и трехзначные.
TINYINT (3) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 002.
SMALLINT (M) 2 байта от -32768 до 32767 или от 0 до 65535 Аналогично предыдущему, но с большим диапазоном.Примеры:
SMALLINT — хранит любое число в диапазоне от -32768 до 32767.
SMALLINT UNSIGNED — хранит любое число в диапазоне от 0 до 65535.
SMALLINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и пятизначные.
SMALLINT (4) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 0002.
MEDIUMINT (M) 3 байта от -8388608 до 8388608 или от 0 до 16777215 Аналогично предыдущему, но с большим диапазоном.Примеры:
MEDIUMINT — хранит любое число в диапазоне от -8388608 до 8388608.
MEDIUMINT UNSIGNED — хранит любое число в диапазоне от 0 до 16777215.
MEDIUMINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить и семизначные.
MEDIUMINT (5) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 00002.
INT (M) или INTEGER (M) 4 байта от -2147683648 до 2147683648 или от 0 до 4294967295 Аналогично предыдущему, но с большим диапазоном.Примеры:
INT — хранит любое число в диапазоне от -2147683648 до 2147683648.
INT UNSIGNED — хранит любое число в диапазоне от 0 до 4294967295.
INT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
INT (5) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 00002.
BIGINT (M) 8 байта от -263 до 263-1 или от 0 до 264 Аналогично предыдущему, но с большим диапазоном.Примеры:
BIGINT — хранит любое число в диапазоне от -263 до 263-1.
BIGINT UNSIGNED — хранит любое число в диапазоне от 0 до 264.
BIGINT (4) — предполагается, что значения будут четырехзначные, но по факту будет хранить максимально возможные.
BIGINT (7) ZEROFILL — свободные позиции слева заполнит нулями. Например, величина 2 будет отображаться, как 0000002.
BOOL или BOOLEAN 1 байт либо 0, либо 1 Булево значение. 0 — ложь (false), 1 — истина (true).
DECIMAL (M,D) или DEC (M,D) или NUMERIC (M,D) M + 2 байта зависят от параметров M и D Используются для величин повышенной точности, например, для денежных данных. M — количество отводимых
под число символов (максимальное значение — 64). D — количество знаков после запятой (максимальное значение — 30).Пример:
DECIMAL (5,2) — будет хранить числа от -99,99 до 99,99.
FLOAT (M,D) 4 байта мин. значение +(-) 1.175494351 * 10-39
макс. значение +(-) 3. 402823466 * 1038
Вещественное число (с плавающей точкой). Может иметь параметр UNSIGNED, запрещающий отрицательные числа, но
диапазон значений от этого не изменится. M — количество отводимых под число символов. D — количество символов дробной части. Пример:
FLOAT (5,2) — будет хранить числа из 5 символов, 2 из которых будут идти после запятой (например: 46,58).
DOUBLE (M,D) 8 байт мин. значение +(-) 2.2250738585072015 * 10-308
макс. значение +(-) 1.797693134862315 * 10308
Аналогично предыдущему, но с большим диапазоном. Пример:
DOUBLE — будет хранить большие дробные числа.

Нецелочисленные числовые типыNonintegral Numeric Types

Нецелочисленные типы данных — это значения, представляющие числа с целой и дробной частями.Nonintegral data types are those that represent numbers with both integer and fractional parts.

Нецелочисленные числовые типы данных: (128-разрядная Фиксированная точка), один тип данных (32-разрядная с плавающей запятой) и тип данных double (64-разрядный с плавающей запятой).The nonintegral numeric data types are (128-bit fixed point), Single Data Type (32-bit floating point), and Double Data Type (64-bit floating point). Все типы со знаком.They are all signed types. Если переменная может содержать дробную часть, объявите ее как один из этих типов.If a variable can contain a fraction, declare it as one of these types.

не является типом данных с плавающей запятой. is not a floating-point data type. числа имеют двоичное целочисленное значение и коэффициент масштабирования целого числа, который указывает, какая часть значения является десятичной дробью. numbers have a binary integer value and an integer scaling factor that specifies what portion of the value is a decimal fraction.

Вы можете использовать переменные для денежных значений.You can use variables for money values. Преимущество — точность значений.The advantage is the precision of the values. Тип данных является более быстрым и требует меньше памяти, но он подвергается ошибкам округления.The data type is faster and requires less memory, but it is subject to rounding errors. Тип данных сохраняет полную точность до 28 десятичных разрядов.The data type retains complete accuracy to 28 decimal places.

Числа с плавающей запятой ( и ) имеют большие диапазоны, чем числа, но могут подвергаться ошибкам округления.Floating-point ( and ) numbers have larger ranges than numbers but can be subject to rounding errors. Типы с плавающей запятой поддерживают меньше значащих цифр , чем, но могут представлять значения большей величины.Floating-point types support fewer significant digits than but can represent values of greater magnitude.

Нецелочисленные числовые значения можно выразить как Мммии, в котором MMM является мантиссаом (значащими цифрами), а ие — экспонентой (степенью 10).Nonintegral number values can be expressed as mmmEeee, in which mmm is the mantissa (the significant digits) and eee is the exponent (a power of 10). Самыми высокими положительными значениями нецелочисленных типов являются 7.9228162514264337593543950335 E + 28 для , 4028235E e + 38 для и 1.79769313486231570 e + 308 для .The highest positive values of the nonintegral types are 7.9228162514264337593543950335E+28 for , 3.4028235E+38 for , and 1.79769313486231570E+308 for .

ПроизводительностьPerformance

является наиболее эффективным из типов данных дробной части, так как процессоры на текущих платформах выполняют операции с плавающей запятой с двойной точностью. is the most efficient of the fractional data types, because the processors on current platforms perform floating-point operations in double precision. Однако операции с не так быстро, как с целочисленными типами, такими как .However, operations with are not as fast as with the integral types such as .

Небольшие величиныSmall Magnitudes

Для чисел с наименьшей возможной величиной (ближайшее к 0) переменные могут содержать цифры как небольшие, например, 4.94065645841246544 e-324 для отрицательных значений и 4.94065645841246544 e-324 для положительных значений.For numbers with the smallest possible magnitude (closest to 0), variables can hold numbers as small as -4.94065645841246544E-324 for negative values and 4.94065645841246544E-324 for positive values.

Небольшие дробные числаSmall Fractional Numbers

Если не требуется полный диапазон типа данных, можно использовать тип данных, который может содержать числа с плавающей запятой в диапазоне от-4028235E e + 38 до 4028235E e + 38.If you do not need the full range of the data type, you can use the data type, which can hold floating-point numbers from -3.4028235E+38 through 3.4028235E+38. Наименьшими значениями для переменных являются-1.401298 e-45 для отрицательных значений и 1.401298 e-45 для положительных значений.The smallest magnitudes for variables are -1.401298E-45 for negative values and 1.401298E-45 for positive values. При наличии очень большого числа переменных, содержащих небольшие числа с плавающей запятой, среда CLR иногда может более эффективно хранить переменные и экономить потребление памяти.If you have a very large number of variables that hold small floating-point numbers, the common language runtime can sometimes store your variables more efficiently and save memory consumption.

Целочисленный тип данных integer

Мы можем использовать тип данных для определения объектов, значение которых может быть целым числом. Например, следующие строки определяют сигнал типа и присваивают ему целое число 4.

Как показано на рисунке 2, тип данных относится к категории «стандартных типов», которая определена в пакете “” из библиотеки “”. Как обсуждалось в предыдущей статье, нам не нужно явно делать пакет “” и библиотеку “” видимыми для проекта.

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

На рисунке 3 показан результат ISE симуляции приведенного выше кода. На этом рисунке показан десятичный эквивалент значений ввода/вывода. Например, от 200 нс до 300 нс, входы и равны 3 и -1 соответственно. Таким образом, выход, , равен 3 + (-1) = 2.

Рисунок 3 – Результаты симуляции

При использовании целочисленного типа данных мы не принимаем непосредственного участия в определениях на уровне битов, однако ясно, что реализация для представления определенных сигналов будет использовать несколько бит. Сколько бит будет использоваться для представления целочисленных сигналов в приведенном выше коде? VHDL не указывает точное количество бит, но любая реализация VHDL должна поддерживать как минимум 32-разрядрую реализацию типа . Согласно стандарту, эта 32-разрядная реализация позволяет присваивать объекту типа целое число в диапазоне от -(231-1) до +(231-1).

Иногда мы имеем дело с ограниченными значениями, и для представления небольшого значения неэффективно использовать 32-разрядный сигнал. Например, предположим, что вход принимает значение от до 45. Таким образом, мы можем использовать 6-разрядный сигнал вместо 32-разрядного представления, потому что 4510=1011012. Более того, предположим, что другой вход, , имеет значение в диапазоне от -45 до 45, поэтому должно использоваться знаковое () представление. Учитывая бит знака, нам нужно всего семь битов вместо 32 битов по умолчанию, потому что представление двух -45 равно 1010011. Чтобы добиться значительного сокращения использования ресурсов FPGA, мы можем просто указать диапазон значений сигналов, как в следующем коде:

Данный код предполагает, что входы и находятся в диапазонах от 0 до 45 и от -45 до 45 соответственно. Поскольку равен , диапазон будет от -45 до 90. Ограничение диапазона целых чисел уменьшает объем ресурсов FPGA, необходимых для реализации проекта. Более того, это дает возможность проверить на ошибки на ранних этапах проектирования. Например, предположим, что представляет собой угол, и из системных спецификаций мы знаем, что значение этого угла ограничено диапазоном от -45 до 90.

Как указано в приведенном выше коде, мы можем применить этот диапазон к определению объекта . Теперь, если мы допустим ошибку, которая заставляет значение находиться за пределами указанного диапазона, программное обеспечение симулятора выдаст ошибку и идентифицирует строку кода, которая включает недопустимое присваивание. Например, если мы укажем диапазон как от -45 до 89, а затем присвоим значение 45 и , и , ISIim симулятор прекратит моделирование со следующей ошибкой (ISim – это название симулятора, который включен в программное обеспечение ISE):

(В моем коде моделирования строка 17 содержит присваивание .) Обратите внимание, что симулятор ISIM по умолчанию не отлавливает эти ошибки, связанные с диапазоном; вы должны включить опцию «value range check» (проверка диапазона значений). Если данная опция не включена, симуляция не остановится, и целому числу, объявленному с ограниченным диапазоном, сможет быть присвоено любое значение

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

Аналогичным образом, третье и четвертое объявления должны иметь четыре бита

Первые для объявления требуют трехразрядного представления, хотя второе объявление имеет меньший диапазон. Аналогичным образом, третье и четвертое объявления должны иметь четыре бита.

Иерархии параметризованных классов

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

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

Например:

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

Оператор new

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

Где — это имя класса для объявления и имя класса создаваемого объекта. Переменная — это переменная, в которую сохраняется ссылка на созданный объект. А — это параметры метода создания объекта.

Какие именно могут быть параметры у объекта, решают программисты, которые пишут класс объекта.

Вы уже создавали объекты ранее, и даже пользовались именно этой конструкцией. Надеюсь, вы не забыли?

— это создание переменной типа . — это создание объекта типа . Ну а оператор присваивания заносит в переменную ссылку на новый созданный объект.

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

Примеры создания объектов:

Код Описание
Создает объект типа
Создает объект типа
Создает объект типа : контейнер на элементов типа

Созданные объекты называют объектом класса или экземпляром класса, а класс — классом объекта. Например: переменная хранит ссылку на экземпляр класса .

Значение с плавающей запятой Java

Значения нецелочисленного типа могут быть аналогичным образом выражены путем разделения десятичной части символом ‘.’ (точка) и будут считаться типом double, если буква ‘F’ (или ‘f’) не будет отложена.

Литералы double могут оканчиваться буквой «D» (или «d»), если для удобства чтения это считается целесообразным (но не обязательно).

Также допускается так называемая научная запись для чисел с плавающей запятой, которая заключается в использовании буквы E(e), за которой следует число, выражающее степень 10, которая умножается на число, указанное перед ним:

double mille = 1000.0;
double milleSci = 1.0e3;
float milleFloat = 1000.0f;

Начиная с версии 7 Java, можно использовать символ подчеркивания (‘_’) во всех числовых литералах для повышения их читабельности, например, путем разделения тысяч:

float milleEasy = 1_000.0f;

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

Символьные и строковые литералы

Значения символьного типа могут быть выражены с помощью символов Unicode (UTF-16), заключенных в одинарные кавычки, которые в конечном итоге могут быть выражены в форме кодировки с использованием «escape-последовательности Unicode»:

char simbol = 'ñ';
char code = '\u00F1';

Также поддерживаются некоторые специальные представления (известные как escape-последовательности):

Побег символ
\b backspace (назад)
\t табуляция
\n перевод строки (конец строки)
\f перевод страницы (конец страницы / новая страница)
\r возврат каретки
\’ отображение одинарной кавычки
\” отображение двойной кавычки
\\ обратная косая черта ( \)
Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий