Как различаются числа signed и unsigned если старший бит это знаковый?

Я тут повторял способы хранения двоичных кодов и никак не могу понять, как будут выполняться арифметические операции для двух чисел: 1-е знаковое (signed) 2-е беззнаковое (unsigned)? Ведь у них может быть одинаковая запись.

Получается у signed старший бит означает знак числа, а у unsigned старший бит означает само значение.

Но как понять какое из них signed а какое unsigned, ведь числа записываются одинаково: например число 173 (10101101) unsigned и число -45 (10101101) signed у них совершенно одинаковая запись.

В данном случае я рассматриваю только 8 битные числа, т.е. от -127 до 127 и от 0 до 255.


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

Автор решения: Serge-V

Не совсем так. Например, unsigned short

173 = 0x00AD = 00000000 10101101

Возьмем signed short

-45 = 0xFFD3 = 11111111 11010011

А вообще, если в двоичной системе счисления взять два одинаковых числа, то всё будут решать типы данных.

Вот, например, поиграйтесь с переводом в разные системы счисления здесь

→ Ссылка
Автор решения: MarianD

Языки программирования, в которых программист вынужден заниматься внутренним (бинарным) представлением чисел

  • т.е. определить их как signed или unsigned

никогда не позволяют операции, в котором один операнд типа signed и другой unsigned:

  • или выдают ошибку,
  • или по умолчанию переводят их в один тип.

Как вы правильно написали, ни человек, ни компьютер не сможет определить только на базе бинарного представления числа, если оно со знаком или без знака. Потому в языках как C/C++ число сначала должно определит, и даже когда в определении отсутствует signed или unsigned, всё равно оно будет одним из них по умолчанию.

С другой стороны, в языках как Питон вы ничего не определяете, вы просто напишете x = 173 или x = -45, незная (и не должен знать) ничего о его внутреннем представлении.

→ Ссылка