Как различаются числа signed и unsigned если старший бит это знаковый?
Я тут повторял способы хранения двоичных кодов и никак не могу понять, как будут выполняться арифметические операции для двух чисел: 1-е знаковое (signed) 2-е беззнаковое (unsigned)? Ведь у них может быть одинаковая запись.
Получается у signed старший бит означает знак числа, а у unsigned старший бит означает само значение.
Но как понять какое из них signed а какое unsigned, ведь числа записываются одинаково: например число 173 (10101101) unsigned и число -45 (10101101) signed у них совершенно одинаковая запись.
В данном случае я рассматриваю только 8 битные числа, т.е. от -127 до 127 и от 0 до 255.
Ответы (2 шт):
Не совсем так. Например, unsigned short
173 = 0x00AD = 00000000 10101101
Возьмем signed short
-45 = 0xFFD3 = 11111111 11010011
А вообще, если в двоичной системе счисления взять два одинаковых числа, то всё будут решать типы данных.
Вот, например, поиграйтесь с переводом в разные системы счисления здесь
Языки программирования, в которых программист вынужден заниматься внутренним (бинарным) представлением чисел
- т.е. определить их как
signedилиunsigned
никогда не позволяют операции, в котором один операнд типа signed и другой unsigned:
- или выдают ошибку,
- или по умолчанию переводят их в один тип.
Как вы правильно написали, ни человек, ни компьютер не сможет определить только на базе бинарного представления числа, если оно со знаком или без знака. Потому в языках как C/C++ число сначала должно определит, и даже когда в определении отсутствует signed или unsigned, всё равно оно будет одним из них по умолчанию.
С другой стороны, в языках как Питон вы ничего не определяете, вы просто напишете x = 173 или x = -45, незная (и не должен знать) ничего о его внутреннем представлении.