Что такое абсолютная величина для целочисленного типа?

Объясните пожалуйста написанное ниже.

Целочисленные типы со знаком имеют большое значение для очень многих алгоритмов, но по абсолютной величине они наполовину меньше своих аналогов без знака. Вот как, например, выглядит число 32 767 типа short в двоичном представлении.

0111111111111111

Если установить старший разряд этого числа равным 1, чтобы получить значение со знаком, то оно будет интерпретировано как -1, принимая во внимание формат дополнения до двух. Но если объявить его как значение типа ushort, то после установки в 1 старшего разряда оно станет равным 65 535."


Ответы (1 шт):

Автор решения: CrazyElf

но по абсолютной величине они наполовину меньше своих аналогов без знака

Тут явно пропущено слово "максимальной" (абсолютной величине). Числа без знака при использовании того же количества бит позволяют представить в два раза большие числа по абсолютной величине (ну, почти). Например, два байта со знаком это числа от -32768 до 32767, а без знака это от 0 до 65535. Количество чисел, которые можно представить - одинаковое, а вот абсолютная величина у беззнаковых чисел возможна почти в 2 раза большая.

Если установить старший разряд этого числа равным 1, чтобы получить значение со знаком, то оно будет интерпретировано как -1

Это значит, что битовое значение 1111 1111 1111 1111, хранимое в памяти, означает как тип short число -1.

формат дополнения до двух

Если я ничего не путаю, то это значит, что отрицательные числа из их битового представления можно вычислить как (единичку в начале я убрал - она даёт нам знак, а не само число):

0111 1111 1111 1111 -
1000 0000 0000 0000 =
                 -1 (short)

Или, если так понятнее:

                  1 +
0111 1111 1111 1111 =
1000 0000 0000 0000

Т.е. как бы сколько нужно добавить к битовому представлению числа, чтобы все его разряды (кроме старшего - знакового) "стали двойкой" или "переполнились". К двоичному числу 0111 1111 1111 1111 нужно добавить 1, чтобы все его числовые разряды "дополнились до двух", поэтому это -1. Знак числа определяется старшим битом, абсолютное значение для отрицательных чисел - вот этим "дополнением до двух".

1xxx xxxx xxxx xxxx

Знак числа: 0 - положительное, 1 - отрицательное

x111 1111 1111 1111 

Собственно число: положительное - как есть, отрицательное - в виде "дополнения до двух".

→ Ссылка