Степени двойки: различия между версиями
м (→Примеры) |
|||
(не показаны 2 промежуточные версии 1 участника) | |||
Строка 3: | Строка 3: | ||
{{q|Чем отличается начинающий программист от законченного? Начинающий думает, что в килобайте 1000 байт<ref>В 1998 году придумали двоичные приставки ([[w:Двоичные приставки|кибибайт]]), которые из-за неблагозвучности приживаются плохо.</ref>, законченный — что в километре 1024 метра|Народное творчество}} | {{q|Чем отличается начинающий программист от законченного? Начинающий думает, что в килобайте 1000 байт<ref>В 1998 году придумали двоичные приставки ([[w:Двоичные приставки|кибибайт]]), которые из-за неблагозвучности приживаются плохо.</ref>, законченный — что в километре 1024 метра|Народное творчество}} | ||
{{q|В мире есть два вида чисел: ноль, и те, которые приводят к ошибке переполнения}} | {{q|В мире есть два вида чисел: ноль, и те, которые приводят к ошибке переполнения}} | ||
Компьютеры работают с числами. Причём в подавляющем большинстве случаев число разрядов в этих числах ограничено<ref>Бывает еще «[[w:длинная арифметика|длинная арифметика]]», но она тормозная. Поэтому вы вряд ли встретите ее за пределами математических программ, которым вот кровь из носа, а нужно пересчитать все атомы во Вселенной.</ref>. Что будет, если место есть под три цифры, а нам надо записать число | Компьютеры работают с числами. Причём в подавляющем большинстве случаев число разрядов в этих числах ограничено<ref>Бывает еще «[[w:длинная арифметика|длинная арифметика]]», но она тормозная. Поэтому вы вряд ли встретите ее за пределами математических программ, которым вот кровь из носа, а нужно пересчитать все атомы во Вселенной.</ref>. Что будет, если место есть под три цифры, а нам надо записать число 9 999? Правильно, одна девятка куда-то потеряется и получится 999. Что будет, если мы к этому 999 прибавим единичку? Получится 1000, но первая цифра опять куда-то потеряется и 1000 превратится в 000. Это собственно суть арифметического переполнения и есть. Для геймера это означает, что невероятно раскачанный персонаж с 999 пунктами здоровья внезапно помрёт, получив еще один пунктик здоровья сверху (999+1=0). | ||
Вернемся теперь к заглавной теме. В отличие от людей, компьютер работает в двоичной системе счисления. То есть знает только две | Вернемся теперь к заглавной теме. В отличие от людей, компьютер работает в двоичной системе счисления. То есть знает только две цифры — ноль и единицу. Попытки сделать десятичные<ref>Первые компьютеры как раз чаще были десятичными — потому что иначе либо требовался отдельный блок преобразования двоичных чисел в десятичные и обратно, либо нужно было учить операторов оперировать восмеричными или шестнадцатеричными числами, что было бы потенциальным источником ошибок. Но десятичная логика была чересчур сложной и вскоре от неё отказались, однако ещё какое-то время на мини-компьютерах, наподобие советского МИР-а, применялась двоично-десятичная система — когда число разбивается на десятичные цифры и каждая представляется в двоичном коде. Более того, несколько команд для работы с такими числами сохраняются непонятно для чего и в современных процессорах</ref> или троичные компьютеры предпринимались, но как-то не прижилось. Поэтому описанное в абзаце выше переполнение происходит не когда число достигает степени десятки, а когда оно достигает степени двойки. И вместо 999+1=0 выходит 255+1=0. Пока все понятно и далекому от компьютеров человеку. Однако давайте подумаем, что будет, если теперь вычесть из нуля единицу? Говорите, будет −1? Нет, компьютер у нас знает ноль, знает единицу, а этот ваш минус не знает. Поэтому мы договоримся, что если первая двоичная цифра — ноль, значит число положительное (0 001 = 1). А если единица — отрицательное (1 001 = −1)<ref>Это называется «прямой код». Обычно используется более хитрый «[[w:дополнительный код|дополнительный код]]» (1 111 = −1), потому что при нём ошибка переполнения ставится на пользу делу, позволяя не городить отдельную схему под сумматор для отрицательных чисел. До того, как всё устананилось, также существовал «обратный код», в котором был [[Вывих мозга|отрицательный ноль]] (1 000 = −0, 0 000 = +0).</ref>. Тут жадные программисты и говорят: не хотим мы целый разряд под знак тратить, дайте нам беззнаковые числа. Окей, дают им беззнаковые числа. Но теперь при вычитании из нуля единицы опять фигня получается — ноль превращается в 255! Ну или еще какое-то значение 2<sup>n</sup>−1.<ref>Кстати, это тоже называется переполнением.</ref> Тут внимательный читатель может возразить: постойте, постойте, даже калькулятор в подобных ситуациях просто выдаст ошибку. Правильно, процессор тоже в таких ситуациях вывешивает флажок (даже два) «ребят, тут фигня какая-то вышла». Но так уж повелось, что в целях повышения быстродействия никто на этот флажок не смотрит. | ||
Стоит отметить, что всё вышесказанное актуально в основном для старых игр. Компьютеры тогда были 8<nowiki>–</nowiki>16-разрядными (с пониманием чисел больше 65535 проблемы), памяти мало (мегабайт | Стоит отметить, что всё вышесказанное актуально в основном для старых игр. Компьютеры тогда были 8<nowiki>–</nowiki>16-разрядными (с пониманием чисел больше 65535 проблемы), памяти мало (мегабайт оперативки — это круто, да и зачем — «640 килобайт хватит всем»), а у программистов было модно экономить на всем (да зачем тратить на число целых два байта? И одного хватит). Теперь компьютеры стали 64-битовыми (числа переполняются в районе 9 223 372 036 854 775 807), памяти — гигабайты, так что вышеописанные проблемы отошли в прошлое. Зато пришло неумерное использование оперативной памяти и процессора. | ||
Другая проблема связана с представлением дробей. Мы привыкли использовать для всего десятичные дроби, однако компьютеру привычнее работать с двоичными числами. Только двоичным числом представить банальное 0,1 не получится, поэтому приходится | Другая проблема связана с представлением дробей. Мы привыкли использовать для всего десятичные дроби, однако компьютеру привычнее работать с двоичными числами. Только двоичным числом представить банальное 0,1 не получится, поэтому приходится придумывать отдельную систему. Дробные числа могут быть представлены в виде чисел с фиксированной запятой (целая часть отдельно, дробная часть отдельно), либо с плавающей запятой (число разделено на мантиссу и порядок, то есть представляется в виде ''двойки'', умноженной на число, возведённое в степень другого числа). Отличаются тем, что фиксированная запятая точная, но ограниченная, а плавающая неточная, зато имеет огромный диапазон вплоть до того, что часть значений зарезервировали под нечисловые.<ref>В частности положительная бесконечность, отрицательная бесконечность, и контринтуитивное «не число», обозначающее ошибку вычислений. А ещё в стандартном представлении двоичных чисел с плавающей запятой одно значение зарезервировано под ''ноль'', так как в этом самом стандартном представлении сэкономили на одном разряде мантиссы и соответственно минимальное «естественное» значение не может быть нулевым.</ref> | ||
Глюки с подобными числами обычно проявляются в том, что значение, двигаясь попеременно то в одну, то в другую сторону не может достигнуть нуля, хотя и должно по всем законам математики. У чисел с плавающей запятой также крайне редко, но случается обратная проблема, аналогичная переполнению — при перемножении слишком малых чисел они обращаются в нуль. Собственно это переполнение и есть, только переполняется не само число, а его разряд. | |||
== [http://www.artmoney.ru/r_faq.htm Что и на каких значениях переполняется] == | == [http://www.artmoney.ru/r_faq.htm Что и на каких значениях переполняется] == | ||
Строка 26: | Строка 28: | ||
| Целое 8 байт || от 0 до 18446744073709551616 || Деньги если они измеряются миллиардами | | Целое 8 байт || от 0 до 18446744073709551616 || Деньги если они измеряются миллиардами | ||
|- | |- | ||
| С точкой 4 байта || от 1, | | С точкой 4 байта || от 1,5 × 10^(−45) до 3,4 × 10 ^ 38 || Используются в некоторых играх, особенно компании Microsoft | ||
|- | |- | ||
| С точкой 6 байта || от 2, | | С точкой 6 байта || от 2,9 × 10^(−39) до 1,7 × 10^38 || Используется в DOS играх, сделанных на Turbo Pascal | ||
|- | |- | ||
| С точкой 8 байта || от 5 | | С точкой 8 байта || от 5,0 × 10^(-324) до 1,7 × 10^308 || Используется в играх Macromedia Flash | ||
|- | |- | ||
| С точкой 10 байта || от 3 | | С точкой 10 байта || от 3,4 × 10^(-4951) до 1,1 × 10^4932 || Используется в основном в математических программах | ||
|} | |} | ||
Стоит уточнить, что в подавляющем большинстве случаев современные целочисленные значения — знаковые, то есть диапазон не от нуля до числа, а от -(x/2) до (x/2-1). В некоторых языках программирования, например, Java,<ref>Не путать с JavaScript — он всё считает плавающими восьмибайтовыми.</ref> вообще все целые значения знаковые. Чаще всего встречаются знаковые 4 байта — от −2 147 483 648 до 2 147 483 647. | |||
== Примеры == | == Примеры == | ||
=== Как ограничение === | === Как ограничение === | ||
* Традиционная [[тайлсет|плитка]] | * Традиционная [[тайлсет|плитка]] — 16×16 пикселей. | ||
* [[WarCraft/WarCraft II|WarCraft II]], [[StarCraft]] | * [[WarCraft/WarCraft II|WarCraft II]], [[StarCraft]] — ограничение на [[мана|ману]] в 255 единиц. | ||
** В StarCraft обработано: энергии (космооперной маны) может быть либо 200 (без апгрейда), либо 250 (с апгрейдом и у героев), либо 180 (у брудлингов, которые теряют 1 единицу в секунду и живут 3 минуты с обоснованием, что без энергии жить не могут). | ** В StarCraft обработано: энергии (космооперной маны) может быть либо 200 (без апгрейда), либо 250 (с апгрейдом и у героев), либо 180 (у брудлингов, которые теряют 1 единицу в секунду и живут 3 минуты с обоснованием, что без энергии жить не могут). | ||
** В эпичном редакторе карт Warcraft II на лимите в 255 завязано практически все: | ** В эпичном редакторе карт Warcraft II на лимите в 255 завязано практически все: 25500 — максимум НР любого юнита, 2550 — максимум его цены (в каждом ресурсе), 255 — максимум его маны, защиты, базового и проникающего урона. | ||
*** Вот только максимум разведки все-таки 9, максимум дальнобойности 15, а некоторые апгрейды стоят 3000. | *** Вот только максимум разведки все-таки 9, максимум дальнобойности 15, а некоторые апгрейды стоят 3000. | ||
*** Также в Wacraft II на карте одновременно не могло существовать более 255 юнитов любого типа (считая строения и считая юниты всех игроков, включая нейтральные объекты) | *** Также в Wacraft II на карте одновременно не могло существовать более 255 юнитов любого типа (считая строения и считая юниты всех игроков, включая нейтральные объекты) — при попытке создать больше игра выдавала «Cannot create more units». | ||
* В играх серии [[Heroes of Might and Magic]] у одного игрока не может быть больше 8 героев. | * В играх серии [[Heroes of Might and Magic]] у одного игрока не может быть больше 8 героев. | ||
** Точнее, героев может быть сколько угодно, не может быть больше восьми армий в поле. По городским гарнизонам, а в четвёртой части и в охране шахт, можно иметь сколько угодно героев. | ** Точнее, героев может быть сколько угодно, не может быть больше восьми армий в поле. По городским гарнизонам, а в четвёртой части и в охране шахт, можно иметь сколько угодно героев. | ||
** В четвёртой части также существует предел юнитов в 1 | ** В четвёртой части также существует предел юнитов в 1 отряде — 32767. | ||
*** Ха, в четвертой! [http://faqs.org.ru/games/strat/hmm26.htm Вот тут] пишут про вторую: | *** Ха, в четвертой! [http://faqs.org.ru/games/strat/hmm26.htm Вот тут] пишут про вторую: | ||
{{q|pre=1| | {{q|pre=1| | ||
Строка 53: | Строка 57: | ||
* при попытке разделить -N единиц войска единственная возможность — поделить на 1 и -(N+1), таким образом можно «наотщипывать» сколь угодно большое войско; | * при попытке разделить -N единиц войска единственная возможность — поделить на 1 и -(N+1), таким образом можно «наотщипывать» сколь угодно большое войско; | ||
* отрицательное войско может быть проапгрейжено за отрицательные деньги, то есть с приплатой игроку.}} | * отрицательное войско может быть проапгрейжено за отрицательные деньги, то есть с приплатой игроку.}} | ||
* [[The Elder Scrolls IV: Oblivion]] | * [[The Elder Scrolls IV: Oblivion]] — ограничение на уровень характеристики или навыка в 255 единиц. Лучше всего заметно на скорости бега и высоте прыжка. Впрочем, эти значения не получить без читов. | ||
** Причём в Morrowind, несмотря на то, что он вышел на несколько лет раньше, такого ограничения нет — характеристики и навыки представлены четырёхбайтовыми числами, а не однобайтовыми. Откуда? А под переоптимизацию под консоль — в отличие от Морры, где пришлось делать по факту две игры с двумя разными интерфейсами и системами просчёта, Oblivion изначально делался под ограничения консоли и на компьютер «портировался» без использования его мощностей. Отсюда же потеря использования мышки в интерфейсе (у геймпада курсора нет) и несуразный инвентарь на целых 6 пунктов (телевизор у консоли значительно дальше от игрока, чем монитор у компьютера), но к степеням двойки это уже не относится. | |||
* В различных цветовых моделях значения каналов от 0 до 255. | * В различных цветовых моделях значения каналов от 0 до 255. | ||
* Размеры текстур: 256×256, 512×512, 1024×1024 | * Размеры текстур: 256×256, 512×512, 1024×1024 и т. д. Многие игры позволяют расширить текстуру вдвое или вчетверо (на этом основаны HD Pack’и старых игр). Но сделать её, например, 1000×1000 <strike>не даст уже видеоплата</strike> новые расширения команд графического процессора (уже несколько лет как) позволяют подобное сделать, однако, делать так всё же не стоит — хоть видеокарты и поддерживают текстуры, не являющиеся степенями двойки, на практике такие текстуры заметно тормозят. Потому такие картинки популярны в демках «вау! посмотри, как мы можем!», но практически не встречаются в реальных играх. | ||
** в готовой игровой текстуре, в которую добавлены Mip-уровни, намеренно вводится дополнительный пиксель на стороне, в сторону которой упакованы мипы. | ** в готовой игровой текстуре, в которую добавлены Mip-уровни, намеренно вводится дополнительный пиксель на стороне, в сторону которой упакованы мипы. То есть разрешение бывает, скажем, 4097х1024. Так надо. | ||
* [[Mount & Blade]] | * [[Mount & Blade]] — В Истории Героя в отряд персонажа могло входить только 32 вида юнитов, что обламывало любителей модов, которые хотели собрать легион из бессмертных NPC. | ||
* [[Вселенная X]] | * [[Вселенная X]] — от центра сектора можно отлететь максимум на 4294,967295 км, далее происходит переполнение, и расстояние меняет знак. Пролетев дальше, корабль возвращается в исходную точку. | ||
* [[Civilization]] | * [[Civilization]] III — число цивилизаций было ограничено числом 31 (32-е место занимали варвары, за которых нельзя играть). Это аукнулось не только мододелам, но и самим разработчикам, когда во втором аддоне (Conquests) число играбельных цивилизаций довели до 32, но для одной просто не хватило места. «Хотите играть за Австрию? Диалоги, записи в энциклопедии и анимацию лидера мы вам добавили, а дальше вы уж как-нибудь сами — в файле сценария удалите любую цивилизацию, добавьте вместо неё Австрию, вручную пропишите ей города, лидеров и установите ссылки у юнитов и построек» — ответили разработчики. | ||
** До кучи число городов на карте было ограничено 255 (проблема для мододелов, решивших воссоздать политическую карту 20 века на «огромной» карте), но при таком количестве городов обсчёт всех автоматических действий на каждом ходу всё равно занимал столько времени, что доводить до такого мало кому хотелось. | ** До кучи число городов на карте было ограничено 255 (проблема для мододелов, решивших воссоздать политическую карту 20 века на «огромной» карте), но при таком количестве городов обсчёт всех автоматических действий на каждом ходу всё равно занимал столько времени, что доводить до такого мало кому хотелось. | ||
** В более старых цивах ограничение было на 255 ''юнитов''. В CivIII юнитов уже может быть до 4096, некоторые до этого доигрывались (все дальнейшие юниты при попытке построить их просто забирают ресурсы в никуда, на чем основана одна из тактик борьбы с ИИ на особо высокой сложности). | ** В более старых цивах ограничение было на 255 ''юнитов''. В CivIII юнитов уже может быть до 4096, некоторые до этого доигрывались (все дальнейшие юниты при попытке построить их просто забирают ресурсы в никуда, на чем основана одна из тактик борьбы с ИИ на особо высокой сложности). | ||
** Такое же ограничение существует в Rome Medieval II: Total War (31 фракция + неиграбельные мятежники). Побороть его разработчики смогли лишь в | ** Такое же ограничение существует в Rome Medieval II: Total War (31 фракция + неиграбельные мятежники). Побороть его разработчики смогли лишь в 2021 году. | ||
* [[Touhou Project]] | * [[Touhou Project]] — в ранних частях максимально возможным значением Power было 128. При этом, числом оно обозначалось только до 127, а потом просто писалось MAX. | ||
* [[Minecraft]] — до «уплощения» системы идентификаторов в 1.13 в игре могло быть только до 4 096 блоков, и у каждого из них могло быть только до 15 вариантов, а вещей — 32 767 (вернее, 28 671, 32 767 — 4 096, потому что у каждого блока может быть представление в виде вещи, но не все из них используются) и у каждой до 32 767 подвариантов либо запаса прочности. Под идентификатор использовалось целочисленное знаковое шестибайтовое число (вернее, три двухбайтовых), у которого 16 бит были отведены под идентификатор вещей, 16 под прочность, 12 под идентификатор блоков и 4 бита под вариант блока. С прикрученным фитильком и там, и там, так как варианты и урон можно реализовать через дополнительные данные (TileEntity для блоков, NBT-теги для вещей), снимая это ограничение. | |||
** Количество вещей в одном стеке ограничено 64, а по факту — 255, так как под него используется один байт. Почему не 127, хотя игра написана на Java? Потому что по факту это 4-байтовое число, у которого используется только 1 байт,<ref>Это вообще сейчас абсолютно везде — числами с разрядностью, совпадающей с разрядностью системы, банально быстрее считать. Даже «4-байтовые» сейчас на самом деле 8-байтовые, так как разрядность современных систем — 64 бита.</ref> а не 1-байтовое знаковое. | |||
=== Как ошибка === | === Как ошибка === | ||
Строка 84: | Строка 91: | ||
* [[Total War]] Medieval 2 — иногда на трон всходят безумцы и/или параноики, находящиеся не в ладах с реальностью. Такие персонажи имеют из-за своих свойств −1 или −2 к ''влиятельности'' (основной параметр, характеризующий персонажа как короля). Если они также не обладают никакими примечательными чертами (дающими уже «плюс» к влиятельности), то получается… влиятельность 10 (максимальное значение!). «Подданные боготворят этого правителя». Курьёз по-своему историчен, потому что в реальности тоже случалось, что сумасшедшие визионеры обретали прочную любовь подданых — разумеется, не тех, кто с ними сталкивался лично. А самое забавное, что стоит такому правителю немного «исправиться» — получить какой-нибудь бафф +1 к влиятельности — и всё сразу же возвращается на круги своя: «подданные смеются», «его никто не уважает» и т. п. | * [[Total War]] Medieval 2 — иногда на трон всходят безумцы и/или параноики, находящиеся не в ладах с реальностью. Такие персонажи имеют из-за своих свойств −1 или −2 к ''влиятельности'' (основной параметр, характеризующий персонажа как короля). Если они также не обладают никакими примечательными чертами (дающими уже «плюс» к влиятельности), то получается… влиятельность 10 (максимальное значение!). «Подданные боготворят этого правителя». Курьёз по-своему историчен, потому что в реальности тоже случалось, что сумасшедшие визионеры обретали прочную любовь подданых — разумеется, не тех, кто с ними сталкивался лично. А самое забавное, что стоит такому правителю немного «исправиться» — получить какой-нибудь бафф +1 к влиятельности — и всё сразу же возвращается на круги своя: «подданные смеются», «его никто не уважает» и т. п. | ||
* В [[S.T.A.L.K.E.R.]] можно перегрузить положительную репутацию. Видимо, люди не верят, что кто-то в Зоне может быть таким добрым. | * В [[S.T.A.L.K.E.R.]] можно перегрузить положительную репутацию. Видимо, люди не верят, что кто-то в Зоне может быть таким добрым. | ||
* Transport | * [[Transport Tycoon]] Deluxe. Если в редакторе карты построить город, а потом быстро-быстро его сносить, иногда изменения численности обрабатываются некорректно и получаются города с населением около 65536 человек. Такой город в игре активно привлекает субсидии, но при этом не дает пассажиров на станции (потому что число пассажиров зависит не от населения города, а от домов в окрестности станции, а дома снесены). | ||
* Анекдот о [[w:Ли Цинъюн|Ли | * Анекдот о [[w:Ли Цинъюн|Ли Цинъюне]], умершем на 256-м году жизни от переполнения счётчика. | ||
** Схожий анекдот про шестнадцатибитного Змея Горыныча, помершего после того как Илья Муромец срубил ему 65535-ю голову. | ** Схожий анекдот про шестнадцатибитного Змея Горыныча, помершего после того как Илья Муромец срубил ему 65535-ю голову. | ||
* [[Noita]]: | * [[Noita]]: | ||
** Чанки (области мира квадратной формы) могут хранить до 128 материалов каждый. Если принести в чанк больше, отойти так, чтобы его содержимое перестало обрабатываться, а потом вернуться, | ** Чанки (области мира квадратной формы) могут хранить до 128 материалов каждый. Если принести в чанк больше, отойти так, чтобы его содержимое перестало обрабатываться, а потом вернуться, «лишние» материалы превратятся в другие в зависимости от порядка попадания в чанк. | ||
** Некоторые параметры в игре привязаны к счётчикам наигранного времени (в кадрах или собственно времени). И если играть боле 145 часов с одного сохранения, у вас: | ** Некоторые параметры в игре привязаны к счётчикам наигранного времени (в кадрах или собственно времени). И если играть боле 145 часов с одного сохранения, у вас: | ||
*** Сломается анимация жидкостей | *** Сломается анимация жидкостей | ||
Строка 95: | Строка 102: | ||
*** Сломается телекинетический пинок | *** Сломается телекинетический пинок | ||
** Наконец, если накрутить 9942 часов, всё превратится в молнию из-за того, что значение электрического заряда на блоках хранится относительно счётчика времени, который из-за переполнения начинает показывать огромное отрицательное число пока ещё через 9942 часов не переполнится обратно. | ** Наконец, если накрутить 9942 часов, всё превратится в молнию из-за того, что значение электрического заряда на блоках хранится относительно счётчика времени, который из-за переполнения начинает показывать огромное отрицательное число пока ещё через 9942 часов не переполнится обратно. | ||
* [https://habr.com/ru/articles/924838/comments/#comment_28528302 История] с Ingenico e-Payments: | * [https://habr.com/ru/articles/924838/comments/#comment_28528302 История] с Ingenico e-Payments: — «Так и случилось в один прекрасный момент несколько лет назад, когда путешествия на Бали (смотри курс [[Смешные деньги|индонезийской рупии]] IDR) стали внезапно стоить сущие центы из-за переполнения. <del>Распродажу</del> Лавочку прикрыли только к утру, когда заметили невероятную популярность клиента Agoda и отелей на Бали, и до исправления просто прекратили (на полгода) принимать платежи в валюте IDR». | ||
=== Как [[багофича]] === | === Как [[багофича]] === | ||
* [[Pokemon]] | * [[Pokemon]] — начиная с первого поколения, где покемонов было всего 151, а слотов для их размещения, соответственно, немного больше (256—151=105 «лишних» слотов). В итоге неиспользуемые были просто забиты MissingNo. и прочей забагованной ерундой, которая, однако, многим игрокам сама по себе пришлась по нраву. Так и повелось с тех пор. | ||
** На принципе переполнения также завязаны многие хакерские приёмчики вроде «Berry glitch», при помощи которых можно копировать вещи, превращать одних покемонов в других и так далее. | ** На принципе переполнения также завязаны многие хакерские приёмчики вроде «Berry glitch», при помощи которых можно копировать вещи, превращать одних покемонов в других и так далее. | ||
*** Berry glitch это вовсе не хакерский приёмчик, а некритичный, но неприятный баг, который в доинтернетную<ref>Для портативок, конечно же.</ref> эпоху пытались пофиксить множеством способов, и по итогу патч<ref>Вместе с сохранением и всеми покемонами.</ref> слетал, если в картридже разряжалась батарейка. | *** Berry glitch это вовсе не хакерский приёмчик, а некритичный, но неприятный баг, который в доинтернетную<ref>Для портативок, конечно же.</ref> эпоху пытались пофиксить множеством способов, и по итогу патч<ref>Вместе с сохранением и всеми покемонами.</ref> слетал, если в картридже разряжалась батарейка. | ||
Строка 106: | Строка 113: | ||
=== Примеры === | === Примеры === | ||
* [[S.T.A.L.K.E.R.]], [[S.T.A.L.K.E.R./Shadow of Chernobyl|самый первый]] | * [[S.T.A.L.K.E.R.]], [[S.T.A.L.K.E.R./Shadow of Chernobyl|самый первый]] — если набрать редких артефактов на 30 % сопротивления одному типу аномалий так, что оно перевалит за сотню, нахождение в этой аномалии начнёт вас лечить и чинить снаряжение. Пофикшено. | ||
** Нифига не пофикшено. Даже на правленных движках от моддерского сообщества 5 лет назад лечение от 100+ процентного сопротивления работало. | ** Нифига не пофикшено. Даже на правленных движках от моддерского сообщества 5 лет назад лечение от 100+ процентного сопротивления работало. | ||
* Дилогия Divinity: Original Sin | *** Зависит от движка, в OGSR например намеренно починили, в некоторых других сохранили как [[Багофича|багофичу]]. | ||
* Дилогия [[Divinity: Original Sin]] — аналогично: если [[Резист|сопротивление]] у кого-то больше 100 %, то данное воздействие начинает его лечить. Это уже фича, а не баг. | |||
** Аналогично в [[Epic Battle Fantasy]], пятой, по крайней мере. | ** Аналогично в [[Epic Battle Fantasy]], пятой, по крайней мере. | ||
* [[ | ** И в [[Tales of Maj'Eyal]]. Сияющие ужасы с их 200 % сопротивления огню — [[Именно то, что написано на упаковке|ужас]] для [[ходячий крематорий|магов огня]]. А вот игрок даже 100 % сопротивления (кроме некоторых константных вроде сопротивления мгновенной смерти, которые существуют в движке только потому, что он задуман как универсальный) набрать не может, ограничено искусственно. | ||
* [[Dota 2]] — тот самый случай с уроном. Достигается сложно и, скорее всего, пофикшен. | |||
* Адский [[эксплойт]] в ранних версиях [[Silent Storm]]: прокачкой рукопашного боя затраты очков действия на него уменьшаются до нуля, а потом удары начинают давать очки действия, позволяя зачистить карту без передачи хода противнику. Причём бить можно было вообще всё подряд. | * Адский [[эксплойт]] в ранних версиях [[Silent Storm]]: прокачкой рукопашного боя затраты очков действия на него уменьшаются до нуля, а потом удары начинают давать очки действия, позволяя зачистить карту без передачи хода противнику. Причём бить можно было вообще всё подряд. | ||
* [[Warframe]] | * [[Warframe]] — сабж заботливо обыгран, и [[Критическое попадание|крит шанс]] при желании разгоняется за 300 %, а урон многократно критических попаданий рассчитывается по специальной формуле. Но вот появились моды разлома, которые могут давать бонусы и штрафы практически к любому параметру. В том числе и множителю критического урона, который может от этого опускаться ниже единицы, и таким образом урон от крита становится ''меньше'' обычного. | ||
* [[Minecraft]] | ** Аналогично множитель силы способностей у Новы — её ульта в норме замедляет врагов, но если загнать множитель ниже 100 %, то наоборот начинает ускорять, что очень полезно как для миссий по зачистке (быстрее прибегут — быстрее умрут), так и для выживаний (быстрее умрут — быстрее заспавнятся новые — больше лута). | ||
* [[StarCraft]] | * [[Minecraft]] — как фича. У блоков есть прочность, которая уменьшается в процессе разбивания, и блок ломается по достижении нуля. А у коренной породы, ограничивающей мир снизу, значение отрицательное, что для игры является сигналом к игнорированию любого урона блоку. В ранних версиях можно было сначала вывести прочность блоков коренной породы сначала в положительную сторону переполнением, а потом и снести эту положительную часть, уничтожив блок, но на это требовалось очень много динамита, возможно пофикшено. | ||
* [[Dungeon Siege 2]] | ** Городская легенда — взрывчатка вообще не взаимодействует с прочностью, она использует отдельный параметр взрывоустойчивости (у коренной породы — 1 000 000), сравниваемой с мощностью взрыва. А мощность взрыва не складывается (хоть 1 динамит взорви, хоть миллион — сильнее взрыв не станет, только объёмнее), поэтому уничтожение коренной породы делается другим образом. Например, крышу ада очень долго можно было пробивать тёмными дубами, так как при отращивании веток они не смотрели, какие блоки заменяют. | ||
* [[StarCraft]] 2 — долгое время был следующий баг: если бронебойной ракетой «Воронов» загнать броню юнитов в минус, то иллюзии, порождаемые часовыми протоссов, начинали наносить 0-(-''значение брони'') урона. Очевидно, что в игре 1x1 эксплуатировать его невозможно, а вот в командных играх — [[yt:YX aZgA2hsU|вполне]]. | |||
* [[Dungeon Siege 2]] — сопротивление урону у монстров рассчитывается именно так. Игромеханически моб с сопротивляемостью более 100 % лечится от соответствующий типа атаки. Игрок же такое провернуть не в состоянии, стоит кап на 80 %. | |||
* Ранобэ и манга «[[Только я знаю, что этот мир - игра]]». ГГ попал в [[оживший игровой мир]], где по-прежнему работают багнутые механики. Один из первых примеров это т. н. навык кровавого удара, который лечит. Этот навык наносит урон тьмой, но если надеть два кольца на уменьшение урона стихией тьмы, то удар будет лечить. | * Ранобэ и манга «[[Только я знаю, что этот мир - игра]]». ГГ попал в [[оживший игровой мир]], где по-прежнему работают багнутые механики. Один из первых примеров это т. н. навык кровавого удара, который лечит. Этот навык наносит урон тьмой, но если надеть два кольца на уменьшение урона стихией тьмы, то удар будет лечить. | ||
== Примечания == | == Примечания == | ||
{{примечания}} | |||
{{Nav/Игровой баланс}} | {{Nav/Игровой баланс}} |
Текущая версия на 12:22, 10 июля 2025
![]() | TV Tropes Для англоязычных и желающих ещё глубже ознакомиться с темой в проекте TV Tropes есть статья Powers Of Two Minus One. Вы также можете помочь нашему проекту и перенести ценную информацию оттуда в эту статью. |
![]() | Короче, Склихосовский! От 0 до 255. Или от −128 до 127. |
« | Чем отличается начинающий программист от законченного? Начинающий думает, что в килобайте 1000 байт[1], законченный — что в километре 1024 метра | » |
— Народное творчество |
« | В мире есть два вида чисел: ноль, и те, которые приводят к ошибке переполнения | » |
Компьютеры работают с числами. Причём в подавляющем большинстве случаев число разрядов в этих числах ограничено[2]. Что будет, если место есть под три цифры, а нам надо записать число 9 999? Правильно, одна девятка куда-то потеряется и получится 999. Что будет, если мы к этому 999 прибавим единичку? Получится 1000, но первая цифра опять куда-то потеряется и 1000 превратится в 000. Это собственно суть арифметического переполнения и есть. Для геймера это означает, что невероятно раскачанный персонаж с 999 пунктами здоровья внезапно помрёт, получив еще один пунктик здоровья сверху (999+1=0).
Вернемся теперь к заглавной теме. В отличие от людей, компьютер работает в двоичной системе счисления. То есть знает только две цифры — ноль и единицу. Попытки сделать десятичные[3] или троичные компьютеры предпринимались, но как-то не прижилось. Поэтому описанное в абзаце выше переполнение происходит не когда число достигает степени десятки, а когда оно достигает степени двойки. И вместо 999+1=0 выходит 255+1=0. Пока все понятно и далекому от компьютеров человеку. Однако давайте подумаем, что будет, если теперь вычесть из нуля единицу? Говорите, будет −1? Нет, компьютер у нас знает ноль, знает единицу, а этот ваш минус не знает. Поэтому мы договоримся, что если первая двоичная цифра — ноль, значит число положительное (0 001 = 1). А если единица — отрицательное (1 001 = −1)[4]. Тут жадные программисты и говорят: не хотим мы целый разряд под знак тратить, дайте нам беззнаковые числа. Окей, дают им беззнаковые числа. Но теперь при вычитании из нуля единицы опять фигня получается — ноль превращается в 255! Ну или еще какое-то значение 2n−1.[5] Тут внимательный читатель может возразить: постойте, постойте, даже калькулятор в подобных ситуациях просто выдаст ошибку. Правильно, процессор тоже в таких ситуациях вывешивает флажок (даже два) «ребят, тут фигня какая-то вышла». Но так уж повелось, что в целях повышения быстродействия никто на этот флажок не смотрит.
Стоит отметить, что всё вышесказанное актуально в основном для старых игр. Компьютеры тогда были 8–16-разрядными (с пониманием чисел больше 65535 проблемы), памяти мало (мегабайт оперативки — это круто, да и зачем — «640 килобайт хватит всем»), а у программистов было модно экономить на всем (да зачем тратить на число целых два байта? И одного хватит). Теперь компьютеры стали 64-битовыми (числа переполняются в районе 9 223 372 036 854 775 807), памяти — гигабайты, так что вышеописанные проблемы отошли в прошлое. Зато пришло неумерное использование оперативной памяти и процессора.
Другая проблема связана с представлением дробей. Мы привыкли использовать для всего десятичные дроби, однако компьютеру привычнее работать с двоичными числами. Только двоичным числом представить банальное 0,1 не получится, поэтому приходится придумывать отдельную систему. Дробные числа могут быть представлены в виде чисел с фиксированной запятой (целая часть отдельно, дробная часть отдельно), либо с плавающей запятой (число разделено на мантиссу и порядок, то есть представляется в виде двойки, умноженной на число, возведённое в степень другого числа). Отличаются тем, что фиксированная запятая точная, но ограниченная, а плавающая неточная, зато имеет огромный диапазон вплоть до того, что часть значений зарезервировали под нечисловые.[6]
Глюки с подобными числами обычно проявляются в том, что значение, двигаясь попеременно то в одну, то в другую сторону не может достигнуть нуля, хотя и должно по всем законам математики. У чисел с плавающей запятой также крайне редко, но случается обратная проблема, аналогичная переполнению — при перемножении слишком малых чисел они обращаются в нуль. Собственно это переполнение и есть, только переполняется не само число, а его разряд.
Что и на каких значениях переполняется[править]
Тип | Диапазон | Примечание |
---|---|---|
Целое 1 байт | от 0 до 255 | Обычно жизнь, количество предметов если их мало, встречается в старых играх, бывает если исчисляется что-то небольшое |
Целое 2 байта | от 0 до 65535 | Обычно жизнь, количество предметов, ресурсы, бывает в старых играх (не не настолько старых, как предыдущий пункт), или если программист решил с большими значениями не заморачиваться |
Целое 3 байта | от 0 до 16777215 | Используются в играх под эмуляторами Sony Playstation, Super Nintendo и др. |
Целое 4 байта | от 0 до 4294967295 | Обычно деньги |
Целое 8 байт | от 0 до 18446744073709551616 | Деньги если они измеряются миллиардами |
С точкой 4 байта | от 1,5 × 10^(−45) до 3,4 × 10 ^ 38 | Используются в некоторых играх, особенно компании Microsoft |
С точкой 6 байта | от 2,9 × 10^(−39) до 1,7 × 10^38 | Используется в DOS играх, сделанных на Turbo Pascal |
С точкой 8 байта | от 5,0 × 10^(-324) до 1,7 × 10^308 | Используется в играх Macromedia Flash |
С точкой 10 байта | от 3,4 × 10^(-4951) до 1,1 × 10^4932 | Используется в основном в математических программах |
Стоит уточнить, что в подавляющем большинстве случаев современные целочисленные значения — знаковые, то есть диапазон не от нуля до числа, а от -(x/2) до (x/2-1). В некоторых языках программирования, например, Java,[7] вообще все целые значения знаковые. Чаще всего встречаются знаковые 4 байта — от −2 147 483 648 до 2 147 483 647.
Примеры[править]
Как ограничение[править]
- Традиционная плитка — 16×16 пикселей.
- WarCraft II, StarCraft — ограничение на ману в 255 единиц.
- В StarCraft обработано: энергии (космооперной маны) может быть либо 200 (без апгрейда), либо 250 (с апгрейдом и у героев), либо 180 (у брудлингов, которые теряют 1 единицу в секунду и живут 3 минуты с обоснованием, что без энергии жить не могут).
- В эпичном редакторе карт Warcraft II на лимите в 255 завязано практически все: 25500 — максимум НР любого юнита, 2550 — максимум его цены (в каждом ресурсе), 255 — максимум его маны, защиты, базового и проникающего урона.
- Вот только максимум разведки все-таки 9, максимум дальнобойности 15, а некоторые апгрейды стоят 3000.
- Также в Wacraft II на карте одновременно не могло существовать более 255 юнитов любого типа (считая строения и считая юниты всех игроков, включая нейтральные объекты) — при попытке создать больше игра выдавала «Cannot create more units».
- В играх серии Heroes of Might and Magic у одного игрока не может быть больше 8 героев.
- Точнее, героев может быть сколько угодно, не может быть больше восьми армий в поле. По городским гарнизонам, а в четвёртой части и в охране шахт, можно иметь сколько угодно героев.
- В четвёртой части также существует предел юнитов в 1 отряде — 32767.
- Ха, в четвертой! Вот тут пишут про вторую:
« | Так как существует артефакт Tax Lien, отнимающий по 250 gold в день, теоретически возможно сделать так, что у игрока будет отрицательная сумма денег, на которую он сможет купить отрицательное количество единиц какого-либо войска. Дерутся отрицательные войска плохо (погибают при любом повреждении), зато
|
» |
- The Elder Scrolls IV: Oblivion — ограничение на уровень характеристики или навыка в 255 единиц. Лучше всего заметно на скорости бега и высоте прыжка. Впрочем, эти значения не получить без читов.
- Причём в Morrowind, несмотря на то, что он вышел на несколько лет раньше, такого ограничения нет — характеристики и навыки представлены четырёхбайтовыми числами, а не однобайтовыми. Откуда? А под переоптимизацию под консоль — в отличие от Морры, где пришлось делать по факту две игры с двумя разными интерфейсами и системами просчёта, Oblivion изначально делался под ограничения консоли и на компьютер «портировался» без использования его мощностей. Отсюда же потеря использования мышки в интерфейсе (у геймпада курсора нет) и несуразный инвентарь на целых 6 пунктов (телевизор у консоли значительно дальше от игрока, чем монитор у компьютера), но к степеням двойки это уже не относится.
- В различных цветовых моделях значения каналов от 0 до 255.
- Размеры текстур: 256×256, 512×512, 1024×1024 и т. д. Многие игры позволяют расширить текстуру вдвое или вчетверо (на этом основаны HD Pack’и старых игр). Но сделать её, например, 1000×1000
не даст уже видеоплатановые расширения команд графического процессора (уже несколько лет как) позволяют подобное сделать, однако, делать так всё же не стоит — хоть видеокарты и поддерживают текстуры, не являющиеся степенями двойки, на практике такие текстуры заметно тормозят. Потому такие картинки популярны в демках «вау! посмотри, как мы можем!», но практически не встречаются в реальных играх.- в готовой игровой текстуре, в которую добавлены Mip-уровни, намеренно вводится дополнительный пиксель на стороне, в сторону которой упакованы мипы. То есть разрешение бывает, скажем, 4097х1024. Так надо.
- Mount & Blade — В Истории Героя в отряд персонажа могло входить только 32 вида юнитов, что обламывало любителей модов, которые хотели собрать легион из бессмертных NPC.
- Вселенная X — от центра сектора можно отлететь максимум на 4294,967295 км, далее происходит переполнение, и расстояние меняет знак. Пролетев дальше, корабль возвращается в исходную точку.
- Civilization III — число цивилизаций было ограничено числом 31 (32-е место занимали варвары, за которых нельзя играть). Это аукнулось не только мододелам, но и самим разработчикам, когда во втором аддоне (Conquests) число играбельных цивилизаций довели до 32, но для одной просто не хватило места. «Хотите играть за Австрию? Диалоги, записи в энциклопедии и анимацию лидера мы вам добавили, а дальше вы уж как-нибудь сами — в файле сценария удалите любую цивилизацию, добавьте вместо неё Австрию, вручную пропишите ей города, лидеров и установите ссылки у юнитов и построек» — ответили разработчики.
- До кучи число городов на карте было ограничено 255 (проблема для мододелов, решивших воссоздать политическую карту 20 века на «огромной» карте), но при таком количестве городов обсчёт всех автоматических действий на каждом ходу всё равно занимал столько времени, что доводить до такого мало кому хотелось.
- В более старых цивах ограничение было на 255 юнитов. В CivIII юнитов уже может быть до 4096, некоторые до этого доигрывались (все дальнейшие юниты при попытке построить их просто забирают ресурсы в никуда, на чем основана одна из тактик борьбы с ИИ на особо высокой сложности).
- Такое же ограничение существует в Rome Medieval II: Total War (31 фракция + неиграбельные мятежники). Побороть его разработчики смогли лишь в 2021 году.
- Touhou Project — в ранних частях максимально возможным значением Power было 128. При этом, числом оно обозначалось только до 127, а потом просто писалось MAX.
- Minecraft — до «уплощения» системы идентификаторов в 1.13 в игре могло быть только до 4 096 блоков, и у каждого из них могло быть только до 15 вариантов, а вещей — 32 767 (вернее, 28 671, 32 767 — 4 096, потому что у каждого блока может быть представление в виде вещи, но не все из них используются) и у каждой до 32 767 подвариантов либо запаса прочности. Под идентификатор использовалось целочисленное знаковое шестибайтовое число (вернее, три двухбайтовых), у которого 16 бит были отведены под идентификатор вещей, 16 под прочность, 12 под идентификатор блоков и 4 бита под вариант блока. С прикрученным фитильком и там, и там, так как варианты и урон можно реализовать через дополнительные данные (TileEntity для блоков, NBT-теги для вещей), снимая это ограничение.
- Количество вещей в одном стеке ограничено 64, а по факту — 255, так как под него используется один байт. Почему не 127, хотя игра написана на Java? Потому что по факту это 4-байтовое число, у которого используется только 1 байт,[8] а не 1-байтовое знаковое.
Как ошибка[править]
- Duck Hunt — после 99 уровней начинается нулевой. На этом уровне вы обязательно проиграете — утки начинают летать по глючной траектории, а собака будет рандомно высовываться и смеяться, даже не спугивая уток.
- Впрочем, чисто теоретически его можно пройти, в таком случае начинается обратно 1 уровень со сбросом скорости уток до обычной. Другое дело, что это без читов крайне сложно и возможно лишь чисто теоретически — хотя в мировом рекорде по очкам игрок все-же умудрился сбить 2 утки на 0 уровне — а значит, теоретически кто-то может насобачиться и пройти его без читов.
- Старая добрая Heroes of Might & Magic III. При получении 75 УР система опыта игры начинает вести себя неадекватно: герою сразу присваивается 88 УР, и начиная с этого момента качаться выше становится не просто глупо, но и опасно. При дальнейшем повышении опыта у героя, его значение превращается в отрицательное количество и УР станет нулевым, либо машина зацикливается и предлагает герою в принципе бесконечную возможность повышения уровня. В первом случае герой фактически теряет прокаченного героя, получая взамен героя с 0 УР, во втором — само продолжение игры становится невозможным из-за «застревания» на бесконечно открывающихся окнах достижения нового уровня.
- X-COM: UFO Defense — как только сила или запас ходов солдата превысит 255, он становится немощным. В более поздних версиях на то и другое поставили предел 80.
- Civilization — сумасшедший Ганди. Городская легенда гласит, что уровень агрессивности в игре определялся однобайтовой неотрицательной переменной, у самых агрессивных правителей она была равна 10, у Ганди — единице. Открытие демократии снижало агрессивность на два, в результате чего у Ганди получался «минус один», вместо какового в данном случае присваивалось максимально возможное значение переменной, то есть 255. Это превращало данного пацифиста в кровожадного маньяка с мотивацией «Что бы такого сделать плохого», от отзыва договоров до тотальной ядерной войны, причем — все сразу в один ход, или около того.
- Это именно городская легенда. В «Цивилизации-1» были три уровня воинственности, а поскольку Ганди развивал науку, он часто первым разрабатывал бомбу и на переговорах заявлял: «Наши требования подкреплены ядерным оружием».
- Pirates! — одна из самых первых культовых игр была, тем не менее, чрезвычайно глючной именно из-за неотслеживаемых переполнений.
- Hearthstone — если атака или здоровье существа превысит 2 147 483 648 (то есть 2 в степени 31), то существо умрет.
- В одном из дополнений это использовали как фичу.
- Существует основанное на синергии Пробойника из Растахановых игрищ, Земляной чешуи из Экспедиции в Ун’Горо и Пчёл из Спасителей Ульдума комбо, позволяющее Друиду получить 2560 единиц брони, основанное на удвоении атаки через урон «ниже нуля». В 2020 комбо исчезло из Стандарта.
- Panzer General первых версий: в режиме игры по переписке один из противников мог оказаться с отрицательным значением престижа… Не-а, его престиж оказывался больше 65500!
- Дальнобойщики: в одном из мест карты можно разогнаться и перемахнуть через ограждающие карту горы. Тогда машина будет падать в ничто, пока ее координата по оси Z не достигнет минимального значения. После этого она перенесется на небо и начнет падать оттуда.
- «Star Wars: Knights of the Old Republic II: The Sith Lords» — Ханхарру можно повысить силу за счет интеллекта. Раз за разом. В определенный момент интеллект падает ниже нуля… до 255-ти.
- Pac-Man — разработчики первой версии аркады не предусмотрели какого-то конца игры, предполагая, что возрастающая сложность не даст игрокам продвинуться слишком далеко. Но некоторые игроки всё-таки смогли пройти 255 уровней… и на 256-м игра начинала некорректно отрисовывать лабиринт (подробное описание см. в википедии).
- В Fallout 4 отсутствует ограничение на получение уровня, однако игра не может переварить значения уровня выше 65535, и вылетает.
- Total War Attila — таким образом можно было обнулить себе казну. А в Warhammer пытались поломать значение отрицательного дохода, но игра перестала адекватно считать содержание армий раньше.
- Total War Medieval 2 — иногда на трон всходят безумцы и/или параноики, находящиеся не в ладах с реальностью. Такие персонажи имеют из-за своих свойств −1 или −2 к влиятельности (основной параметр, характеризующий персонажа как короля). Если они также не обладают никакими примечательными чертами (дающими уже «плюс» к влиятельности), то получается… влиятельность 10 (максимальное значение!). «Подданные боготворят этого правителя». Курьёз по-своему историчен, потому что в реальности тоже случалось, что сумасшедшие визионеры обретали прочную любовь подданых — разумеется, не тех, кто с ними сталкивался лично. А самое забавное, что стоит такому правителю немного «исправиться» — получить какой-нибудь бафф +1 к влиятельности — и всё сразу же возвращается на круги своя: «подданные смеются», «его никто не уважает» и т. п.
- В S.T.A.L.K.E.R. можно перегрузить положительную репутацию. Видимо, люди не верят, что кто-то в Зоне может быть таким добрым.
- Transport Tycoon Deluxe. Если в редакторе карты построить город, а потом быстро-быстро его сносить, иногда изменения численности обрабатываются некорректно и получаются города с населением около 65536 человек. Такой город в игре активно привлекает субсидии, но при этом не дает пассажиров на станции (потому что число пассажиров зависит не от населения города, а от домов в окрестности станции, а дома снесены).
- Анекдот о Ли Цинъюне, умершем на 256-м году жизни от переполнения счётчика.
- Схожий анекдот про шестнадцатибитного Змея Горыныча, помершего после того как Илья Муромец срубил ему 65535-ю голову.
- Noita:
- Чанки (области мира квадратной формы) могут хранить до 128 материалов каждый. Если принести в чанк больше, отойти так, чтобы его содержимое перестало обрабатываться, а потом вернуться, «лишние» материалы превратятся в другие в зависимости от порядка попадания в чанк.
- Некоторые параметры в игре привязаны к счётчикам наигранного времени (в кадрах или собственно времени). И если играть боле 145 часов с одного сохранения, у вас:
- Сломается анимация жидкостей
- Сломается анимация неподобранных палочек
- Отключится мигание звёзд в небе
- Сломается телекинетический пинок
- Наконец, если накрутить 9942 часов, всё превратится в молнию из-за того, что значение электрического заряда на блоках хранится относительно счётчика времени, который из-за переполнения начинает показывать огромное отрицательное число пока ещё через 9942 часов не переполнится обратно.
- История с Ingenico e-Payments: — «Так и случилось в один прекрасный момент несколько лет назад, когда путешествия на Бали (смотри курс индонезийской рупии IDR) стали внезапно стоить сущие центы из-за переполнения.
РаспродажуЛавочку прикрыли только к утру, когда заметили невероятную популярность клиента Agoda и отелей на Бали, и до исправления просто прекратили (на полгода) принимать платежи в валюте IDR».
Как багофича[править]
- Pokémon — начиная с первого поколения, где покемонов было всего 151, а слотов для их размещения, соответственно, немного больше (256—151=105 «лишних» слотов). В итоге неиспользуемые были просто забиты MissingNo. и прочей забагованной ерундой, которая, однако, многим игрокам сама по себе пришлась по нраву. Так и повелось с тех пор.
- На принципе переполнения также завязаны многие хакерские приёмчики вроде «Berry glitch», при помощи которых можно копировать вещи, превращать одних покемонов в других и так далее.
Отрицательные значения[править]
Как было замечено, сейчас проблемы с памятью компьютеров исчезли, и восприятие отрицательных чисел пришло в норму. Но это породило другой математический глюк, достаточно редкий и очень забавный, а зачастую полезный. Суть в том, что от пробивания значением потолка или дна образуется не максимально, а минимально противоположный результат, он тем больше, чем сильнее пробитие: допустим, у нас атака наносит урон в 10 единиц. Но вот на её обладателя повесили пачку дебаффов урона суммарной силой 11. При использовании такой атаки игра вычитает из десяти одиннадцать, а потом получившееся значение вычитает из здоровья цели. И если программист что-то не досмотрел и не сделал ограничения и проверки, оно оказывается отрицательным. В результате игра, повинуясь написанной формуле и законам математики, вычитает из вражеского хп −1, и урон превращается в лечение.
Примеры[править]
- S.T.A.L.K.E.R., самый первый — если набрать редких артефактов на 30 % сопротивления одному типу аномалий так, что оно перевалит за сотню, нахождение в этой аномалии начнёт вас лечить и чинить снаряжение. Пофикшено.
- Нифига не пофикшено. Даже на правленных движках от моддерского сообщества 5 лет назад лечение от 100+ процентного сопротивления работало.
- Зависит от движка, в OGSR например намеренно починили, в некоторых других сохранили как багофичу.
- Нифига не пофикшено. Даже на правленных движках от моддерского сообщества 5 лет назад лечение от 100+ процентного сопротивления работало.
- Дилогия Divinity: Original Sin — аналогично: если сопротивление у кого-то больше 100 %, то данное воздействие начинает его лечить. Это уже фича, а не баг.
- Аналогично в Epic Battle Fantasy, пятой, по крайней мере.
- И в Tales of Maj'Eyal. Сияющие ужасы с их 200 % сопротивления огню — ужас для магов огня. А вот игрок даже 100 % сопротивления (кроме некоторых константных вроде сопротивления мгновенной смерти, которые существуют в движке только потому, что он задуман как универсальный) набрать не может, ограничено искусственно.
- Dota 2 — тот самый случай с уроном. Достигается сложно и, скорее всего, пофикшен.
- Адский эксплойт в ранних версиях Silent Storm: прокачкой рукопашного боя затраты очков действия на него уменьшаются до нуля, а потом удары начинают давать очки действия, позволяя зачистить карту без передачи хода противнику. Причём бить можно было вообще всё подряд.
- Warframe — сабж заботливо обыгран, и крит шанс при желании разгоняется за 300 %, а урон многократно критических попаданий рассчитывается по специальной формуле. Но вот появились моды разлома, которые могут давать бонусы и штрафы практически к любому параметру. В том числе и множителю критического урона, который может от этого опускаться ниже единицы, и таким образом урон от крита становится меньше обычного.
- Аналогично множитель силы способностей у Новы — её ульта в норме замедляет врагов, но если загнать множитель ниже 100 %, то наоборот начинает ускорять, что очень полезно как для миссий по зачистке (быстрее прибегут — быстрее умрут), так и для выживаний (быстрее умрут — быстрее заспавнятся новые — больше лута).
- Minecraft — как фича. У блоков есть прочность, которая уменьшается в процессе разбивания, и блок ломается по достижении нуля. А у коренной породы, ограничивающей мир снизу, значение отрицательное, что для игры является сигналом к игнорированию любого урона блоку. В ранних версиях можно было сначала вывести прочность блоков коренной породы сначала в положительную сторону переполнением, а потом и снести эту положительную часть, уничтожив блок, но на это требовалось очень много динамита, возможно пофикшено.
- Городская легенда — взрывчатка вообще не взаимодействует с прочностью, она использует отдельный параметр взрывоустойчивости (у коренной породы — 1 000 000), сравниваемой с мощностью взрыва. А мощность взрыва не складывается (хоть 1 динамит взорви, хоть миллион — сильнее взрыв не станет, только объёмнее), поэтому уничтожение коренной породы делается другим образом. Например, крышу ада очень долго можно было пробивать тёмными дубами, так как при отращивании веток они не смотрели, какие блоки заменяют.
- StarCraft 2 — долгое время был следующий баг: если бронебойной ракетой «Воронов» загнать броню юнитов в минус, то иллюзии, порождаемые часовыми протоссов, начинали наносить 0-(-значение брони) урона. Очевидно, что в игре 1x1 эксплуатировать его невозможно, а вот в командных играх — вполне.
- Dungeon Siege 2 — сопротивление урону у монстров рассчитывается именно так. Игромеханически моб с сопротивляемостью более 100 % лечится от соответствующий типа атаки. Игрок же такое провернуть не в состоянии, стоит кап на 80 %.
- Ранобэ и манга «Только я знаю, что этот мир - игра». ГГ попал в оживший игровой мир, где по-прежнему работают багнутые механики. Один из первых примеров это т. н. навык кровавого удара, который лечит. Этот навык наносит урон тьмой, но если надеть два кольца на уменьшение урона стихией тьмы, то удар будет лечить.
Примечания[править]
- ↑ В 1998 году придумали двоичные приставки (кибибайт), которые из-за неблагозвучности приживаются плохо.
- ↑ Бывает еще «длинная арифметика», но она тормозная. Поэтому вы вряд ли встретите ее за пределами математических программ, которым вот кровь из носа, а нужно пересчитать все атомы во Вселенной.
- ↑ Первые компьютеры как раз чаще были десятичными — потому что иначе либо требовался отдельный блок преобразования двоичных чисел в десятичные и обратно, либо нужно было учить операторов оперировать восмеричными или шестнадцатеричными числами, что было бы потенциальным источником ошибок. Но десятичная логика была чересчур сложной и вскоре от неё отказались, однако ещё какое-то время на мини-компьютерах, наподобие советского МИР-а, применялась двоично-десятичная система — когда число разбивается на десятичные цифры и каждая представляется в двоичном коде. Более того, несколько команд для работы с такими числами сохраняются непонятно для чего и в современных процессорах
- ↑ Это называется «прямой код». Обычно используется более хитрый «дополнительный код» (1 111 = −1), потому что при нём ошибка переполнения ставится на пользу делу, позволяя не городить отдельную схему под сумматор для отрицательных чисел. До того, как всё устананилось, также существовал «обратный код», в котором был отрицательный ноль (1 000 = −0, 0 000 = +0).
- ↑ Кстати, это тоже называется переполнением.
- ↑ В частности положительная бесконечность, отрицательная бесконечность, и контринтуитивное «не число», обозначающее ошибку вычислений. А ещё в стандартном представлении двоичных чисел с плавающей запятой одно значение зарезервировано под ноль, так как в этом самом стандартном представлении сэкономили на одном разряде мантиссы и соответственно минимальное «естественное» значение не может быть нулевым.
- ↑ Не путать с JavaScript — он всё считает плавающими восьмибайтовыми.
- ↑ Это вообще сейчас абсолютно везде — числами с разрядностью, совпадающей с разрядностью системы, банально быстрее считать. Даже «4-байтовые» сейчас на самом деле 8-байтовые, так как разрядность современных систем — 64 бита.
- ↑ Для портативок, конечно же.
- ↑ Вместе с сохранением и всеми покемонами.