отрицательные целые числа в двоичном - PullRequest
3 голосов
/ 06 мая 2011
 5 (decimal) in binary  00000101
-5 (two's complement) in binary 11111011

, но 11111011 также 251 (десятичный)!

Как компьютер отличает одно от другого? Откуда он знает, это -5 или 251 ??

ЖЕ 11111011

Заранее спасибо !!

Ответы [ 4 ]

4 голосов
/ 06 мая 2011

Байты со знаком имеют максимум 127.

Байты без знака не могут быть отрицательными.

Компилятор знает, имеет ли переменная, содержащая это значение, тип со знаком или не имеет типа и обрабатывает его.соответственно.

0 голосов
/ 06 мая 2011

Если вы спрашиваете, «как программа знает, как интерпретировать значение» - в общем, это потому, что вы сообщили компилятору «тип» переменной, которой вы присвоили значение.На самом деле программе все равно, если 00000101 как «5 десятичных знаков», она просто имеет целое число без знака со значением 00000101 , которое может выполнять операции, допустимые для целых чисел без знака, и будет вести себяопределенным образом, если вы попытаетесь сравнить или привести к другому «типу» переменной.

В конце концов все в программировании сводится к двоичному - все данные (строки, числа, изображения,звуки и т. д.), и скомпилированный код просто превращается в большой двоичный двоичный объект.

0 голосов
/ 06 мая 2011

Дополнение Two предназначено для добавления / вычитания чисел со знаком так же, как и чисел без знака.Таким образом, есть только два случая, когда подпись чисел влияет на компьютер на низком уровне.

  1. при переполнении
  2. при выполнении операций над смешанным: один со знаком,один без знака

Различные процессоры принимают разные тактики для этого.WRT orverflows, например, архитектура MIPS RISC обрабатывает переполнения с использованием прерываний.См. http://en.wikipedia.org/wiki/MIPS_architecture#MIPS_I_instruction_formats

Насколько мне известно, необходимо избегать смешения подписанных и неподписанных на уровне программы.

0 голосов
/ 06 мая 2011

Если ваша программа выбирает обработку байта как подписанного, система времени выполнения решает, следует ли считать этот байт положительным или отрицательным в соответствии с старшим битом.1 в этом старшем бите (бит 7, считая от младшего бита 0) означает, что число является отрицательным;0 в этой битовой позиции означает, что число положительное.Таким образом, в случае 11111011 бит 7 установлен в 1, и число соответственно обрабатывается как отрицательное.

Поскольку знаковый бит занимает одну позицию бита, абсолютная величина числа может варьироваться отОт 0 до 127, как было сказано ранее.

Если ваша программа выбирает обработку байта как беззнакового, с другой стороны, то, что было бы знаковым битом, включается в величину, которая затем может варьироваться от 0до 255.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...