Системы счисления

Вернуться на главную страницу

Содержание

Системы счисления

Если тебе недостаточно материала в этой статье, поищи в интернете более подробную информацию.

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

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

Для перевода чисел из одной системы счисления в другую (и не только для этого) воспользуйся стандартным калькулятором Windows, пример работы с которым есть в списке программ на главной странице.

Числа в трех системах счисления

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

DEC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ... 255
HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 ... FF
BIN 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 100000 ... 11111111

А эта таблица поможет тебе лучше запомнить числа в этих системах без использования калькулятора.

DEC HEX BIN
0 00 0000 0000
1 01 0000 0001
2 02 0000 0010
4 04 0000 0100
8 08 0000 1000
16 10 0001 0000
32 20 0010 0000
64 40 0100 0000
128 80 1000 0000

Описание систем счисления

Для получения подробного описания по системе счисления выбери соответствующую опцию.

DEC

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

Десятичная система счисления (decimal). Как следует из названия системы, за основу взято число 10. В ней мы располагаем десятью знаками-цифрами - от 0 до 9.

0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Когда разряд единиц доходит до 9, для следующего числа вводится старший разряд - десятки, а разряд единиц обнуляется.

9 -> 10, 11, 12...

Когда счет доходит до 99, для следующего числа вводится новый старший разряд - сотни, а разряд десятков и единиц обнуляется.

99 -> 100, 101, 102...

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

HEX

Шестнадцатеричная система счисления (hexadecimal). Шестнадцатеричное число называется "байт", а разряд байта называется "ниббл" (полубайт).

В этой системе счисления за основу взято число 16. Поскольку существует всего 10 цифр от 0 до 9, дополнительно используются первые 6 латинских букв.

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Когда счет достигает F, вводится старший разряд (десятки).

F -> 10, 11, 12...

Когда счет достигает FF, вводится новый старший разряд (сотни).

FF -> 100, 101, 102...

Байт #$00

Несмотря на то, что байт #$00 является числом 0, в ромхакинге он имеет очень важное значение. Например, если у игрока закончились жизни, то есть количество жизней = #$00, наступит Game Over. А также отсчет чего-либо очень часто начинается с #$00.

BIN

Двоичная система счисления (binary). Двоичное число называется "бит". Знание битов необходимо при изучении работы некоторых инструкций, в частности битовых операций и битовых сдвигов.

За основу взято число 2, и используются лишь 2 цифры - 0 и 1.

0, 1

Вводим разряд десятков.

1 -> 10, 11

Вводим разряд сотен.

11 -> 100, 101, 110, 111

Нумерация битов

Биты нумеруются с нулевого по седьмой, справа налево.

7         6         5         4         3         2         1         0
BIN 10000000 01000000 00100000 00010000 00001000 00000100 00000010 00000001

Биты и байты

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

Некоторые байты нужно рассматривать не как байты, а как набор битов. В частности это применимо к управлению в игре, где за 1 кнопку отвечает 1 бит. А из 8-ми кнопок, которые будут нажаты/не нажаты, получается 1 байт.

Знаковые байты

Байты могут быть знаковые (signed) и беззнаковые (unsigned). За знаковость числа, то есть за наличие знака "+" или "-" при переводе в DEC, отвечает старший бит этого байта. В NES все данные 8-битные, поэтому за знаковость числа отвечает бит7.

Unsigned

Беззнаковый байт, который хранит число от 0 до 255. Эти числа получаются при обычном переводе из HEX в DEC байтов #$00-#$FF.

В языке программирования C# тип данных "byte" - беззнаковый.

Signed

Знаковый байт, который хранит число от -128 до 127. Положительными байтами считаются от #$00 до #$7F (от 0 до 127), а отрицательными от #$80 до #$FF (от -128 до -1).

В языке программирования C# тип данных "sbyte" - знаковый.

Отличия

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

Со знаковыми байтами ты столкнешься при изучении флага N (Negative) и инструкций условного перехода с этим флагом.

Обозначение чисел в статьях

DEC

Десятичные числа будут записаны без каких-либо обозначений, например число 29.

HEX

Байты будут записаны двумя символами (даже если разряд десятков = 0) с использованием префикса "#$", например #$1D (число 29 в DEC).

Если потребуется записать 16-битные числа, они будут записаны четырьмя символами, например #$0123.

BIN

Биты будут записаны из восьми символов (даже если старшие разряды числа = 0) с использованием префикса "#%", например #%00011101 (число 29 в DEC).

Номер бита будет обозначаться как бит0, бит1, бит2 и так далее.

Эти 3 префикса применяются в некоторых отладчиках и ассемблерах.

Префикс "#" означает что эти цифры являются неким числом, по умолчанию десятичным.

Префикс "$" значит что это число в системе HEX. Этот префикс используется для указания адресов, но без префикса #. Например, #$1D это число 1D, а $1D это адрес 1D.

Префикс "%" значит что это число в системе BIN.

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

В некоторых документах DEC-числа обозначаются с постфиксом "d" (29d), HEX с постфиксом "h" (1Dh), а BIN с постфиксом "b" (00011101b).