Используется ли дополнение двух отрицательного целого числа только для сложения и вычитания? - PullRequest
0 голосов
/ 22 марта 2020

Так, например,

13 в двоичном виде: 00000000 00000000 00000000 00001101. Будет -13 сохранено как 10000000 00000000 00000000 00001101 (с использованием старшего значащего бита для представления знака) или будет сохранено с использованием дополнение двух? (В частности, в C)

Если он хранится с использованием старшего значащего бита для представления знака, когда фактически используется дополнение до двух?

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Комплимент Two - это популярная форма представления чисел, где половина двоичного диапазона отрицательна. Он может использоваться для всех арифметических операций c, а не только для сложения и вычитания. Проще говоря, «имеет смысл» хранить числа таким образом. Причиной этому могут быть алгоритмы сжатия, в которых вы хотите избежать использования слишком большого количества битов (например, зигзагообразного формата и т. Д.).

Например, для умножения двух 8-битных чисел "5" и "- 3 ", которые представлены в двоичном виде как 101 и 11111101, компьютер может разбить это на проблему проверки каждого бита в одном множителе и суммирования другого фактора, смещенного на каждый установленный бит:

  5<<0
+ 5<<2 (skipping 5<<1, because that bit is not set)
+ 5<<3
+ 5<<4
+ 5<<5
+ 5<<6
+ 5<<7
------
  1265 

1265 переносится в 241 в 8-битном пространстве, которое является двоичным 11110001, что является дополнением до двух для -15. На некоторых старых компьютерах умножение занимало больше времени с тем, сколько битов числа установлено, вероятно, из-за требуемой дополнительной арифметики c.

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

Другими словами, «нет», оно используется не только для сложения и вычитания.

0 голосов
/ 22 марта 2020

C может хранить отрицательное число в любом формате, в зависимости от реализации. Самым популярным (в настоящее время другие системы почти не используются) является формат двух комплиментов.

Но ваши числа не являются комплиментарными.

-13 в двоичном виде - 0b111111111111111111111111111111111111111111111111111111110011

чтобы увидеть без знака представление отрицательных чисел: https://godbolt.org/z/ajDDvc

...