| Компьютеры работают с числами. Причем, в подавляющем большинстве случаев число разрядов в этих числах ограничено. Что будет если место есть под три цифры, а нам надо записать число 9 999? Правильно, одна девятка куда-то потеряется и получится 999. Что будет если мы к этому 999 прибавим единичку? Получится 1000, но первая цифра опять куда-то потеряется и 1000 превратится в 000. Это собственно суть арифметического переполнения и есть. Для геймера это означает что невероятно раскаченный персонаж с 999 пунктами здоровья, внезапно помрет получив еще один пунктик здоровья сверху (999+1=0). | | Компьютеры работают с числами. Причем, в подавляющем большинстве случаев число разрядов в этих числах ограничено<ref>бывает еще «[[:w:длинная арифметика]]», но она тормозная. Поэтому, вы вряд ли встретите ее за пределами математических программ, которым вот кровь из носа, а нужно пересчитать все атомы во Вселенной</ref>. Что будет если место есть под три цифры, а нам надо записать число 9 999? Правильно, одна девятка куда-то потеряется и получится 999. Что будет если мы к этому 999 прибавим единичку? Получится 1000, но первая цифра опять куда-то потеряется и 1000 превратится в 000. Это собственно суть арифметического переполнения и есть. Для геймера это означает что невероятно раскаченный персонаж с 999 пунктами здоровья, внезапно помрет получив еще один пунктик здоровья сверху (999+1=0). |
| Вернемся теперь к заглавной теме. В отличие от людей, компьютер работает в двоичной системе исчисления. То есть, знает только две цифры - ноль и единицу. Попытки сделать десятичные или троичные компьютеры предпринимались, но как-то не прижилось. Поэтому, описанное в абзаце выше переполнение происходит не когда число достигает степени десятки, а когда оно достигает степени двойки. И вместо 999+1=0, выходит 255+1=0. Пока все понятно и далекому от компьютеров человеку. Однако, давайте подумаем что будет если теперь вычесть из нуля единицу? Говорите, будет -1? Нет, компьютер у нас знает ноль, знает единицу, а этот ваш минус не знает. Поэтому, мы договоримся что если первая двоичная цифра - ноль, значит число положительное (0 001=1). А если единица - отрицательное (1 001=-1)<ref>Обычно используется более хитрый "[[:w:дополнительный код]]", но суть примерно та же, так что замнем для ясности</ref>. Тут жадные программисты и говорят, не хотим мы целый разряд под знак тратить, дайте нам беззнаковые числа. Окей, дают им беззнаковые числа. Но теперь при вычитании из нуля единицы, опять фигня получается - ноль превращается в 255! Ну или еще какое-то значение 2^n-1. Тут внимательный читатель может возразить что постойте, постойте, даже калькулятор в подобных ситуациях просто выдаст ошибку. Правильно, процессор тоже в таких ситуациях вывешивает флажок "ребят, тут фигня какая-то вышла". Но так уж повелось что в целях повышения быстродействия, никто на этот флажок не смотрит. | | Вернемся теперь к заглавной теме. В отличие от людей, компьютер работает в двоичной системе исчисления. То есть, знает только две цифры — ноль и единицу. Попытки сделать десятичные или троичные компьютеры предпринимались, но как-то не прижилось. Поэтому, описанное в абзаце выше переполнение происходит не когда число достигает степени десятки, а когда оно достигает степени двойки. И вместо 999+1=0, выходит 255+1=0. Пока все понятно и далекому от компьютеров человеку. Однако, давайте подумаем что будет если теперь вычесть из нуля единицу? Говорите, будет −1? Нет, компьютер у нас знает ноль, знает единицу, а этот ваш минус не знает. Поэтому, мы договоримся что если первая двоичная цифра — ноль, значит число положительное (0 001=1). А если единица — отрицательное (1 001=-1)<ref>Обычно используется более хитрый «[[:w:дополнительный код]]», но суть примерно та же, так что замнем для ясности</ref>. Тут жадные программисты и говорят, не хотим мы целый разряд под знак тратить, дайте нам беззнаковые числа. Окей, дают им беззнаковые числа. Но теперь при вычитании из нуля единицы, опять фигня получается — ноль превращается в 255! Ну или еще какое-то значение 2^n-1. Тут внимательный читатель может возразить что постойте, постойте, даже калькулятор в подобных ситуациях просто выдаст ошибку. Правильно, процессор тоже в таких ситуациях вывешивает флажок «ребят, тут фигня какая-то вышла». Но так уж повелось что в целях повышения быстродействия, никто на этот флажок не смотрит. |
| Стоит отметить что все вышесказанное актуально в основном для старых игр. Компьютеры тогда были 8-16 разрядными (с пониманием чисел больше 65535 проблемы), памяти мало (мегабайт оперативки это круто!), а у программистов было модно экономить на всем (да зачем тратить на число целых два байта? И одного хватит). Теперь компьютеры стали 64-битовыми (числа переполняются в районе 9 223 372 036 854 775 807), памяти - гигабайты, так что вышеописанные проблемы отошли в прошлое. | | Стоит отметить что все вышесказанное актуально в основном для старых игр. Компьютеры тогда были 8-16 разрядными (с пониманием чисел больше 65535 проблемы), памяти мало (мегабайт оперативки это круто!), а у программистов было модно экономить на всем (да зачем тратить на число целых два байта? И одного хватит). Теперь компьютеры стали 64-битовыми (числа переполняются в районе 9 223 372 036 854 775 807), памяти — гигабайты, так что вышеописанные проблемы отошли в прошлое. |