Степени двойки

Материал из Posmotre.li
Перейти к: навигация, поиск
Склифосовский.pngВкратце
От 0 до 255. Или от −128 до 127.
« Чем отличается начинающий программист от законченного? Начинающий думает, что в килобайте 1000 байт, законченный — что в километре 1024 метра »
— Народное творчество
« В мире есть два вида чисел: ноль, и те, которые приводят к ошибке переполнения »
— Автор неизвестен

1. 2. 4. 8. 16. 32. 64. 128. 256. 512. 1024. 2048. 4096. 8192. 16384. 32768. 65536. А вы сколько чисел из этого ряда можете вспомнить? Автор этой статьи вспомнил 17. А профессиональный айтишник досчитает как минимум до двоичного миллиона (того самого, который «мега» в мегабайтах).

Так уж сложилось, что все компьютеры работают в двоичной системе (предлагались и троичные компьютеры[1], и даже десятичные[2], но они не взлетели). Поэтому для любой компьютерной программы, в том числе и видеоигры, степени двойки — настолько же естественные и важные числа, насколько для нас степени десятки (1, 10, 100, и т. д.).

Казалось бы, эти числа важны только для программистов, а геймеру знать о них необязательно? Но нет, то тут, то там в видеоиграх эти числа всплывают. Или явно (например, как пределы какого-то переменного параметра, например скорости в космосиме), или скрыто, в виде багов (например, знаменитый баг «сумасшедший Ганди» в первой Civilization). Любая переменная величина в памяти компьютера ограничена именно этими числами[3]. Если переменная может принимать только положительные значения и нуль, то ее пределы — от 0 до степени двойки минус 1 (например, 255, 65535). Если и отрицательные, то от отрицательной степени двойки до той же, но положительной степени двойки минус 1 (например, от −128 до 127). И если поверх этих ограничений не наложены какие-то, более естественные для человека (скажем, максимум патронов для пулемёта — не 255, а 200), то именно этими числами и будет ограничена переменная.

А что будет, если переменная превысит свои пределы? Будет переполнение: 255 превратится в 0 (или наоборот, 0 в 255). Персонаж, подвергшийся переполнению, будет вести себя дико, примеры см. ниже.

Содержание

[править] Примеры

[править] Как ограничение

[править] Как ошибка

[править] Примечания

  1. Например, ЭВМ «Сетунь», для своего времени вполне передовая машина. В XXI веке к идее изредка возвращаются, предпринимая в рамках университетских курсов попытки разработать небольшие и качественные полупроводниковые троичные логические элементы.
  2. Например, именно десятичным был американский Mark I, который часто называют «первым в мире программируемым компьютером» (более ранние — и более совершенные! — машины Конрада Цузе «политкорректно» забываются, поскольку они были созданы в гитлеровской Германии).
  3. в компьютере вообще все данные представлены в двоичном виде, с соглашением о том, что байт равен восьми битам, где бит может быть единицей или нулём. Байт может содержать число или букву, но понять это компьютер не сможет если программист не укажет тип данных - int для чисел и char для не-чисел. Однако некоторые данные в такой размер не влезают, и тогда появляются другие типы данных - например string (строка, последовательность байт заданного размера). Несовпадение типов может привести к двум неприятным последствиям: сложение числа с буквой (мы же помним что и то и другое - последовательность единиц и нулей, да?), или вылет с ошибкой типизации. Первое приводит к огромному количеству очень трудноотлавливаемых багов, и в некоторых случаях - к особой магии, доставляющей программистам (и игрокам), причем исправление ошибки, как ни странно, игру ухудшало. Дробные числа, исторически, хранятся в переменных типа float (т.е. с плавающей точкой), и для программистов, которые до этого надстраивали на цельночисленном процессоре свою собственную математику с экспоненциальным счислением, это доставляло ещё больше, так как их обработкой занимался математический сопроцессор со своим собственным ассемблером.
Личные инструменты
Пространства имён
Варианты
Действия
Навигация
Инструменты