Сб. Сен 7th, 2024

Как было показано, целочисленная арифметика в ограниченном числе разрядов несколько отличается от обычной. При выполнении арифметических действий в целочисленной k-разрядной арифметике возможно возникновение следующих ошибок:

  • левые цифры результата, выходящие за отведенное количество разрядов, оказываются утерянными;
  • при сложении двух положительных чисел, представленных в знаковом типе данных, мы можем получить отрицательное число, если в результате сложения в левом знаковом разряде окажется единица.

Выполним сложение 100 и 51 в 8-разрядном знаковом типе. В 8-разрядном компьютерном представлении эти числа имеют следующий вид:

100 = 011001002 и 51 = 001100112.

При сложении этих чисел получим 100101112. Первая единица (знаковый разряд) указывает на то, что в остальных разрядах получено отрицательное число. Получим теперь значение данного отрицательного числа по его дополнительному коду. Оно в итоге равно -105.

Таким образом, 100 + 51 = -105 в 8-разрядной знаковой арифметике.

Вычислим значения факториала в широко распространенном знаковом 16-разрядном типе (int Turbo-Pascal). Значение:

7! = 1·2·3·4·5·6·7 = 5250 = 1010010000010210002

уместится в 16-ти разрядах, а значение:

8! = 7!·8 = 10100100000102·10002 = 10100100000100002

в 16-ти разрядах уже не уместится. Для записи этого числа требуется как минимум 17 разрядов в знаковом типе. При записи значения 8! в 16 разрядов самая старшая (значащая) единица попадает в знаковый разряд и трактуется как знак отрицательного числа. Таким образом, получившееся значение соответствует отрицательному числу -25216.

Следует заметить, что и в 32-разрядном целом типе возможно получить только значение 12!, а для 13! результат будет неверным, хотя полученное в 32-разрядной знаковой арифметике число окажется положительным: 1 932 053 504. При умножении 12! на 13 результат содержит 33 значащих двоичных цифры, то есть самая левая единица в 32-разрядной арифметике оказывается утерянной, а вторая слева цифра равна 0, что и определяет положительный знак результата такого умножения в знаковом типе. Полученное положительное значение может ввести в заблуждение: в случае отрицательного результата его ошибочность очевидна, а в данном случае — нет.

От content