Это потому, что при инверсии инвертируются все разряды, в том числе и знаковый. Смотрите:
9, это ведь не 1001, как вам бы хотлеось. Это, на самом деле 0 000 0000 0000 1001, где первый бит - знаковый разряд.
После инверсии мы получаем - 1 111 1111 1111 0110, что сильно напоминает представление числа -10 в дополнительном коде.
10 - 1010 - 0 000 0000 0000 1010 инвертируем - 1 111 1111 1111 0101. Это у нас обратный код. Добавляем единицу, что бы получить дополнительный - 1 111 1111 1111 0110. Вуаля!.
Так что всё работает верно ))). Честно сказать, я теорию уже подзабыл, давненько не возился с обратным и дополнитлеьным кодом, но мне сдается, что объяснение в этом.
Я вот тоже столкнулся с такой же проблемой, что при побитовой инверсии, ручной просчет и результат который выдает Си значительно расходяться. Почитал эту тему, поискал в инете, но там все "кусками", и не очень понятен сам алгоритм перевода в дополнительный код и обратный, и для чего вообще они используються.
LazarusLong, не могли бы Вы объяснить сам алгоритм по шагам, как надо считать, ЧТОБЫ РЕЗУЛЬТАТ ИНВЕРТИРОВАНИЯ СОШЕЛСЯ С ТЕМ ЧТО МНЕ ВЫДАЕТ СИ. Вот то что я вроде понял, если что подправтье пожалуйста:
Например, поинвертируем все то же число 9: при ручном просчете, как уже было сказано, получаеться:
9 = 1001
~9 = 0110 = 6
А теперь, просичтаем так, как считает Си, который выдает что ~9 = -10, при использовании типа int :
1) Так как используетьс тип int, который занимает 2 байта, то есть 16 бит, то переводим число в 2-ичную систему и дополняем его нулями до 16 знаков, где первый бит знаковый разряд ( 0 -положительный, 1 -отрицательный):
9 (в 10-тичной) = 0 000 0000 0000 1001 (в 2-ичной)
2) Далее инвертируем все биты числа: получаеться - 1 111 1111 1111 0110. Это мы получили дополнительный код.
Если перевести это число в 10-тичную систему, то получаеться 65526, такой результат даже выдает Си, но только в том случае если вместо int поставить unsigned int.
Вот здесь возникает 1-ый вопрос по самому алгоритму: что делать дальше ? Получили дополнительный код, а вот как узнать каком числу соответствует этот дополнительный код
3) Не знаю правильно ли, но мне кажеться, что нужно перевести этот дополнительный код в обратный? Для этого мы должны отнять единицу от дополнительного кода
Если это действительно так, то получаеться:
1 111 1111 1111 0110 - 1 = 1 111 1111 1111 0101.
4) Вот здесь возникает 2-ой вопрос: по сути дела, нам осталось только проинтвертировать еще раз, чтобы получить обратный код, верно
Если, да то получааеться:
~ ( 1 111 1111 1111 0101 ) = 0 000 0000 0000 1010
5) И наконец 3-ий вопрос: если первести это число 0 000 0000 0000 1010 в 10-тичную систему, то получим 10, а куда девалсся минус, он ведь. если верить Си должен присустствовать
LazarusLong, если у Вас найдеться время ответить, или может у кого-нибудь другого, то буду очень благодарен !