Добавлен , опубликован

Курс JASS + vJASS

Содержание:

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

Примитивные типы названы так потому, что они простые. Я уже приводил вам пример в прошлом уроке, где тип loation (точка) состоит из трех переменных real (x, y, z), а тип unit состоит из кучи числовых значений: здоровье, макс. здоровье, мана, макс. мана и т.д. Так вот, примитивные типы содержат внутри себя только одно значение. real и integer содержат только одно число, boolean содержит в себе только что-то одно из true и false.
К примитивным типам данных относят только три типа: real (реальная), integer (целочисленная) и boolean (логическая).

Возможные значения

У каждого типа есть свои возможные значения, я уже показывал их вам в прошлом уроке. Но для полноты картины покажу еще раз. Также тут есть и новая информация.
Для типа boolean возможны только два значения это true (правда) и false (ложь).
Возможные значения для типа real это любое число в десятичной записи (...-234, -423.4234423, -44, -0.42, 0, 0.5, 1, 3.1443, 423, 24342...)
Возможные значения для типа integer это любое целое число (...-15, -2, 0, 1, 11...).
Минимальное возможное число для real и integer примерно -2 147 483 648, а максимальное примерно 2 147 483 647. Если зайти за эти пределы, например, к максимальному числу прибавить еще немножко, то число переполнится. Если вам интересно, рассмотрим что такое переполнение чуть позже.

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

Для типов real и integer доступны все арифметические операции (+ - * /) и операции сравнения (==, !=, <, <=, >, >=).
Арифметические операции мы уже рассматривали в предыдущем уроке. Вы уже обладаете необходимыми знаниями для их использования, но там еще есть что изучать. Более подробно мы рассмотрим их в уроке по математике для джасса.
Для типа boolean доступны две операции сравнения (==, !=) и все логические операции (not, and, or).
Операции сравнения и логические операции рассмотрим в следующих уроках.

Различия между real и integer

Несмотря на то, что типы real и integer являются числами, между ними есть ряд важных отличий. Большинство этих отличий касаются типа real, он ведёт себя немного иначе чем ожидается. В университетах данному типу отводится целая часовая лекция, но с нашей стороны было бы глупо тратить столько времени на один примитивный тип. Просто знайте о нескольких важных моментах.
Real - это число с плавающей точкой и это значит, что чем больше значение до точки, тем меньше может быть значение после точки и наоборот. А еще математические вычисления с типом real не точны на 100%. Но хоть точность и не стопроцентная, она всё равно достаточно высокая для использования. Также в результате операций над этим типом, могут возникать какие-то мелкие колебания значений. Например, 0.02 +  0.02 +  0.02 + 0.02 + 0.02 = 0.0999999... наткнутся на такой случай сложно потому, что варкрафт округлит его до 0.1, но так бывает не всегда. Обо всех моментах когда точность может нас подводить будем говорить отдельно.  В integer всё четко и точно.
Переменная типа real может без проблем вмещать в себя значение типа integer, но в переменную типа integer нельзя просто так положить значение типа real. При попытке положить значение типа real  в переменную типа integer будет ошибка компиляции. Это происходит потому, что integer хранит только целые числа, а real может хранить как целые, так и дробные числа. Для преобразования real в integer можно использовать функцию R2I:
set udg_Number = R2I(5.8)
call BJDebugMsg(I2S(udg_Integer))
Функция  R2I не округляет число, а просто отбрасывает дробную часть. В нашем коде, сначала значение 5.8 будет превращено в 5, а затем положено в глобальную переменную с именем Number и типом integer (целочисленная). В конце на экран будет выведено число 5.
Все арифметические операции с участием значения типа real вернут значение типа real, не зависимо от того, какое число получится в результате (целое или дробное).

Особенности записи типа integer

Значения типа integer можно записать не только в виде привычной нам десятичной системе записи, а и в следующих системах:
  1. Восьмеричная. Для записи в восьмеричной системе, сначала ставится ноль, а потом идёт стандартная запись восьмеричного числа. Пример: 07 (семь), 012 (десять).
  2. Шестнадцатеричная. Как минимум, она используется в выборе цвета для покраски текста. Для записи в шестнадцатеричной системе, сначала ставится "0x" (ноль икс), а потом идёт стандартная запись шестнадцатеричного числа. Пример: 0x2 (два), 0xA (десять), 0x10 (шестнадцать) , 0xFF (255) .
  3. Одним символом из таблицы ASCII. Таким образом можно написать только числа от 0 до 255. Для этого пишется любой символ из аски в одинарных кавычках '' например: 'A' (65), '<' (60)...
  4. Четырьмя символами из таблицы ASCII. А вот это уже важный способ так, как в таком виде пишут ID. Пример: 'Aloc', 'B000', 'hfoo'... Я не стал писать какие это числа потому, что они очень большие.
Все эти записи это просто способ сказать какое число вы хотите использовать. Вот к примеру, вы же понимаете число 2, слово "два" и римское число II? Это одно и то же самое число, просто по-разному написано. Также их можно смешивать в выражениях, например можно догадаться, что 'hfoo' - 1 это на один меньше чем просто 'hfoo'.
Разбираться со всеми этими способами записи будем позже, когда они нам будут нужны, а сейчас это бессмысленно.

Переполнение

Как я уже писал выше, у числовых примитивов есть ограничение, их значение должно быть в диапазоне примерно от -2 147 483 648 до 2 147 483 647. Если зайти за эти пределы, произойдет переполнение. Для простоты понимания, давайте представим что минимальное число это -5, а максимальное +5. Тогда если добавить к пятерке единицу, будет не 6, а -5. Если же прибавить к пятерке двойку, то будет -4. Сейчас постараюсь объяснить как это работает. Напишем числовую последовательность:
-5 -4 -3 -2 -1  0  1  2  3  4  5
Если мы хотим прибавить к единице тройку, то мы отсчитываем от единицы три позиции вперед: 2, 3, 4. Результат 1 + 3 = 4. Если же мы к примеру, прибавим к двойке пятерку, то нужно будет отсчитать от двойки пять позиций вперед, считаем: 3, 4, 5... А дальше то конец, что делать? Продолжать считать с другого конца: -5, -4. Результат 2 + 5 = -4. Абсурд! Но что поделать, так устроен компьютер. Если отнимать от числа и выйти за нижнюю границу будет то же самое. Например, -4 - 2 = 5.
Всё описанное выше не отображает реальный принцип работы компьютера, не стоит думать, что он "считает на пальцах". Просто, устройство чисел с плавающей точкой слишком сложно объяснить новичкам. Поэтому, я привел более простой пример.
А теперь пример из jass кода:
call BJDebugMsg("-2147483648 - 100 = " + I2S(-2147483648 - 100))
call BJDebugMsg("2147483647 + 100 = " + I2S(2147483647 + 100))
На экран будет выведены сообщения "-2147483648 - 100 = 2147483548" и "2147483647 + 100 = -2147483549".
Не стоит бояться переполнения, столкнутся с ним на практике довольно сложно. Даже если вы будете в таймере каждые 0.01 секунд считать от 0 до 2147483548, то это займет у вас 248 с половиной реальных дней. Или может, у вас будет урон в два миллиарда? Ну, тогда вы явно делаете что-то не так.

`
ОЖИДАНИЕ РЕКЛАМЫ...