Программирование на языке Scala/Примитивные типы данных Int, Long, Short, Byte
В Scala, основными базовыми элементами являются примитивные данные, которые описываются примитивными типами. Таких типов немного, но комбинируя их в сложных конструкциях, можно получить бесконечное множество других типов данных.
Как и все прочие типы данных, примитивные типы данных имеют определённую область значений и перечень операций, которые могут быть выполнены с этим типом данных.
Операция определенная для типа называется методом этого типа.
Работа с примитивными данными хорошо оптимизирована, они используются очень часто, и для решения проблем оптимизации они выделены в отдельную группу типов.
Все типы данных имеют свое уникальное название и оно должно начинаться с большой буквы.
Тип Int
[править]Тип данный Int
является моделью целых чисел, которые могут быть положительными, отрицательными или нулевыми. В отличии от математических целых чисел имеет ограничения в размерах области определения, и не является бесконечным. Диапазон его значений от -231 до 231-1. Таким образом тип имеет 4 294 967 296 значений. В большинстве случает этого достаточно для расчетов
Для типа Int определено много различных операции. Их можно поделить на группы:
- Арифметические
- Логические
- Поразрядные
- Конвертирования
- Прочие
Операции бывают:
- Унарными, с одним аргументом. Операция отрицания имеет один аргумент. Операции конвертации имеют один аргумент.
- Бинарными, с двумя аргументами. Например операция сложения имеет два аргумента. Бинарные операции могут иметь вторым агрументом не только тип Int.
Типы Int, Long, Short и Byte имеют перечень одинаковых операции по названию.
Типы имеют совместимость друг с другом по цепочке Byte -> Short -> Int -> Long.
У примитивных типов имеются литералы, с помощью которых можно задать значение этого тип данных.
У типа Int есть:
- Десятичные литералы, например:
0
,1
,2
,3
. - Шестнадцатеричные литералы (числа в исчислении по основанию 16), например:
0x5
,0x00FF
. Префикс 0x в начале числа показывает, что это шестнадцатеричное число. В числе используются символы от 0 до 0 и от A до F.
Проблемы и ограничения типа Int
[править]Переполнение
[править]Так как тип Int не бесконечный, и имеет ограничение на минимальное и максимальное значения, по при операциях +, -, * и конвертации - может возникнуть переполнение. Переполнение происходит, когда результат операции не может быть представлен в допустимом диапазоне значений для данного типа.
Получить максимальные минимальные значения типа можно из констант:
Int.MinValue
Int.MaxValue
Внимание! Ошибка переполнения значения типа даже при выполнении программы может не быть обнаружена из за особенностей работы JVM, если не предпринимать дополнительных проверок! При возникновении переполнения появляется значение выбраное из противоположного края диапазона значений, и программа продолжает работать, обрабатывая это значение, что обычно приводит к другим ошибкам вычисления.
Решение проблемы переполнения в конкретном типе лежит полностью на программисте, и к сожалению машинный анализ кода компилятором не поможет выявить данную проблему. Основной источник ошибок переполнения - это неконтролируемые входные данные. Проверяя входные данные на корректность и контролируя их размер, можно полностью исключить ошибки переполнения, если конечно в самом коде выбраны правильные типы и математические операции учитывают диапазон значений типа.
При строгом соблюдении рекомендаций проблема переполнения не является часто встречающейся проблемой при разработке программ. Можно считать, что такое поведение типа - это плата за производительность этого типа данных. Если нужен полностью правильный и безопасный тип данных для целых чисел, его можно создать самостоятельно или воспользоваться более сложными, готовыми.
Деление на ноль
[править]Часто встречающаяся проблема с типом Int, это деление на ноль. Эта проблема выявляется при выполнении программы, но не выявляется при анализе кода компилятором. Проблема связана с отсутствием в области определения типа Int таких значений, как минус бесконечность, плюс бесконечность, неопределенное значение. Соответственно, тип Int не может правильно представить значение некоторых операций. Опять же, решение проблемы деления на ноль возложена на разработчика, и требует создания специальных проверок. Это плата за производительность этого типа данных.
Целочисленое деление
[править]Операция деления (/) двух чисел типа Int, имеет результатом также тип Int. Пример: 2 / 3 = 0. Для получения значения с дробной частью используйте вторым аргументом тип Double. Пример: 2 / 3.0 = 0.6666666666666666
Тип Long
[править]Для решения проблемы переполнения можно воспользоваться типом Long, который полностью аналогичен типу Int, но имеет диапазон значений значительно больше, значения от -263 до 263-1, это 18 446 744 073 709 551 616 значенией (64 бита). Его применение должно быть обосновано, так как он более тяжеловесен. Обычно он используется в значениях разнообразных счетчиков, так как идеально подходит для этой цели. Проблемы с типов Long, аналогичны проблемам с Int.
У типа Long есть:
- Десятичные литералы, например:
0L
,1L
,3L
. - Шестнадцатеричные литералы (в исчислении по основанию 16), например:
0x5L
,0x00FFL
. Префикс 0x в начале числа показывает, что это шестнадцатеричное число. В числе используются символы от 0 до 0 и от A до F.
Тип Long не является представителем самого большого целого чисела. Тип BigInt обеспечивает практически неограниченный диапазон целых чисел, но он не является примитивным типом данных, и не является быстрым.
Типы Short и Byte
[править]Типы Short, Byte являются декоративными типами, потому что при выполнении программы они превращаются в тип Int. Их применение может быть оправдано в неком протоколе с внешней системой.
Получить значения этих типов можно только преобразовав значение другого типа. У данных типов нет своих литералов.
Домашнее задание:
[править]- В учебном проекте создать файл IntType.sc (Scala-Worksheet).
- В разных строках выполнить 50 разных операции определенных в типе Int и Long. Предсказать и увидеть их значения.
Пример:
Примечание 1:
Полный список операций типов можно вывести в IDE в Scala-Worksheet следующим образом:
- Ввести любой литерал интересуемого типа в поле списка инструкций Scala-Worksheet
- После литерала поставить точку
- Нажать CTR+Пробел
- Появится список доступных операций для данного типа, где слева название операции, в скобках тип второго аргумента, справа тип выходного результата.
Примечание 2:
Описание и реализацию операций, у которых есть текстовые названия, можно увидеть (не всегда), если выполнить Ctr+леваяКнопкаМыши наведя курсор на название операции.