✅ Сайт успешно переехал на новый сервер, MediaWiki обновлена до самой свежей версии, LQT тоже.
Если что-то работает не так, как должно — сообщайте.

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

Материал из 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). Персонаж, подвергшийся переполнению, будет вести себя дико, примеры см. ниже.

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

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

  • WarCraft II, StarCraft — ограничение на ману в 255 единиц.
    • В StarCraft обработано: энергии (космооперной маны) может быть либо 200 (без апгрейда), либо 250 (с апгрейдом и у героев), либо 180 (у брудлингов, которые теряют 1 единицу в секунду и живут 3 минуты с обоснованием, что без энергии жить не могут).
    • В эпичном редакторе карт Warcraft II на лимите в 255 завязано практически все: 25500 — максимум НР любого юнита, 2550 — максимум его цены (в каждом ресурсе), 255 — максимум его маны, защиты, базового и проникающего урона.
      • Вот только максимум разведки все-таки 9, максимум дальнобойности 15, а некоторые апгрейды стоят 3000.
  • В играх серии Heroes of Might and Magic у одного игрока не может быть больше 8 героев.
    • В четвёртой части также существует предел юнитов в 1 отряде — 32767.
  • The Elder Scrolls 4: Oblivion — ограничение на уровень характеристики или навыка в 255 единиц. Лучше всего заметно на скорости бега и высоте прыжка. Впрочем, эти значения не получить без читов.
  • В различных цветовых моделях значения каналов от 0 до 255.
  • Размеры текстур: 256×256, 512×512, 1024×1024 и т. д. Многие игры позволяют расширить текстуру вдвое или вчетверо (на этом основаны HD Pack’и старых игр). Но сделать её, например, 1000×1000 не даст уже видеоплата новые расширения команд графического процессора (уже несколько лет как) позволяют подобное сделать, однако, делать так всё же не стоит — хоть видеокарты и поддерживают текстуры, не являющиеся степенями двойки, на практике такие текстуры заметно тормозят. Потому такие картинки популярны в демках «вау! посмотри, как мы можем!», но практически не встречаются в реальных играх.
  • В Fallout 4 отсутствует ограничение на получение уровня, однако игра не может переварить значения уровня выше 65535, и вылетает.

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

  • X-COM: UFO Defense — как только сила или запас ходов солдата превысит 255, он становится немощным. В более поздних версиях на то и другое поставили предел 80.
  • Civilization — сумасшедший Ганди. Вдруг уровень агрессии скачет от нуля до 255. Это связано с тем, что при открытии демократии уровень агрессии падает на 2, однако у Индии он равен единице. А отрицательное значение игра представить не может
  • Pirates! — одна из самых первых культовых игр была, тем не менее, чрезвычайно глючной именно из-за неотслеживаемых переполнений.
  • Hearthstone — Если атака или здоровье существа превысит 65536, игрок получит существо с 1 единицей атаки/здоровья.

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

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