В чем разница между представлением целых чисел со знаком и без знака на компьютерах?

Обновлено: 21.11.2024

Что это значит?

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

Этот первый бит, бит знака, используется для обозначения того, является ли он положительным (с 0) или отрицательным (с 1). Если вы хотите получить техническую информацию, бит знака 0 означает, что число является неотрицательным, что означает, что оно может равняться десятичному нулю или положительному числу.

(-/+) 2 6 2 5 2 4 2 3 2 2 2 1 2 0
0 1 0 0 1 1 0 1

Примечание. Я использую запись X2 для двоичных целых чисел и запись X10 для десятичных целых чисел.

В чем разница?

Двоичные числа без знака

Для просмотра двоичных чисел единицы и нули действуют как переключатели, которые метафорически включают степень двойки, а затем складываются для создания десятичного значения. Обычно мы «отмечаем» битовое значение единицей.

Пример 1a:
Без знака 01012 = 510

2 3 2 2 2 1 2 0
0 1 0 1

Пример 2а:
1001 без знака2 = 910

2 3 2 2 2 1 2 0
1 0 0 1

Двоичные числа со знаком

Пример 1b:
Подписано 01012 = +510

< /th> < /таблица>

Когда двоичное число со знаком является положительным или отрицательным, оно "помечается" 0 или 1 соответственно в первом крайнем левом бите, бите знака. Цифра выше не меняется. Это просто более явное положительное число.

Пример 2b:
Подписано 10012 = -710

(-/+) 2 2 2 1 2 0
0 1 0 1
< /th> < /таблица>

Но приведенное выше двоичное число полностью меняется. И теперь мы представляем минус!

Отрицательные двоичные числа

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

(-/+) 2 2 2 1 2 0
1 0 0 1
< /th> < /таблица>

Переход от двоичного числа без знака к двоичному целому со знаком изменяет конечное значение несколькими способами. Во-первых, это более очевидное изменение значения, когда первый бит используется для обозначения знака вместо значения. Вы можете видеть между примерами 2a и 2b выше, что это означает, что если бы у вас была единица в первом бите вашего 4-битного целого числа, вы теряете значение 2 3, которое было бы добавлено к вашему конечному значению с беззнаковым бит, но теперь вместо этого используется для обозначения негатива. С большим битовым целым числом это может быть очень большое значение, которое вы не сможете представить.

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

Чтобы объяснить эту особенность, давайте сравним целые числа с положительным и отрицательным знаком. Работая с 4-битным целым числом, если бы у нас было четыре бита со значением нуля, число было бы равно 0. Это наименьшее значение, которое мы можем иметь. Поскольку неотрицательный бит со знаком означает, что у нас может быть положительное целое число или 0.

4-битное отрицательное целое число из четырех битов единичных значений (те, что теперь являются "выключателем"), число будет равно не 0, а -1. В этом есть смысл, так как это максимальное десятичное число, которое мы можем представить, имея при этом отрицательное значение.

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

(-/+) 2 2 2 1 2 0
1 0 0 1
2 x (-/+) 2 2 2 1 2 0 Всего
битовое значение 0 1 1 0
2 xx бит-значение = + 4 2 0 = 610

Таким образом, даже если бы я идеально переключил "переключатели" с двоичного числа с положительным знаком выше на его отрицательное значение, оно не полностью переключилось бы на его отрицательное десятичное значение, как можно было бы ожидать:

2 x (-/+) 2 2 2 1 2 0 Всего
битовое значение 1 0 0 1
2 xx бит-значение = - 4 2 = -710

Потому что мы добавляем, начиная со значения 1! И мы суммируем значения, представленные в наших битах, перед добавлением отрицательного знака в самом конце нашего вычисления.

В этом визуальном сравнении десятичных и двоичных эквивалентов показано, как целое число со знаком 0 равно десятичному числу 010 или больше, а целое число со знаком 1 соответствует десятичному числу -110. или меньше.

В качестве альтернативы:

Еще один способ вычислить отрицательное значение – продолжать использовать единицы в качестве "маркеров" и использовать бит знака в качестве маркера для значения в соответствующей степени двойки для отрицательного значения. Это также иллюстрирует другой способ понять, что происходит в двоичных отрицательных представлениях.

2 x (-/+)2 3 2 2 2 1 2 0 Всего
битовое значение 1 0 0 1
2 xx бит-значение = -8 0 0 1 = -710

Этот способ вычисления десятичного значения может быть немного проще при работе с меньшими десятичными числами, но становится немного сложнее выполнять некоторые вычисления в уме при работе с большими десятичными числами:

2 x (-/+)2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 Всего< /em>
битовое значение 1 1 1 1 0 0 1 0
2 xx бит-значение = -128 64 32 16 0 0 2 1 = -1410

К счастью, я не могу придумать много ситуаций, в которых вам пришлось бы интерпретировать между ними без подручного калькулятора!

Нахождение максимума и минимума для двоичных чисел со знаком

Диапазон положительных десятичных чисел, которые могут храниться в целочисленных битах любого размера, сокращается из-за того, что первый бит используется для обозначения знака. Это означает, что в случае 32-битного целого числа со знаком мы фактически работаем с 31 битом значения вместо 32, и этот последний бит мог хранить экспоненциально большее целое число. На самом деле это полностью половину сокращает диапазон положительных целых чисел, с которыми мы можем работать, по сравнению с 32-битным целым числом без знака. Этот дополнительный бит удвоил бы максимально возможное целое число, а без него мы теряем возможность хранить как можно больше положительных целых чисел.

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

Давайте рассмотрим 4-битное целое число без знака и целое число со знаком. Наш диапазон может измениться, но количество целых чисел, которые можно сохранить, на самом деле не изменится.

Из-за этой потери бита наш максимум вычисляется как 2 бита - 1 - 1, или, если работать с 32-битными целыми числами 2 31 - 1.
Я объяснил, почему мы должны вычесть единицу в прошлый раз, что нам все еще нужно сделать, поскольку мы включаем ноль в диапазон, а отсутствие вычитания приведет к тому, что для хранения этого числа потребуется один дополнительный бит.

Наш минимум в диапазоне является обратным значением, -2 бита - 1 или, при работе с 32-битными целыми числами, -2 31 . Мы не вычитаем единицу для нашего минимального диапазона, потому что ноль не включен, и мы начинаем считать с -1. Это дает нам одно дополнительное отрицательное число в нашем диапазоне, которое может быть представлено.

Приведенный выше диапазон может помочь понять, почему нет вычитания из нижнего диапазона, в то время как для верхнего диапазона есть. Ноль входит в зеленый диапазон, но не входит в красный диапазон битов со знаком.Мы начинаем с -1 и можем иметь такое же количество чисел, представленных как неотрицательные.

Здесь у нас есть 8 положительных целых чисел.

Здесь у нас есть 8 положительных и отрицательных целых чисел. Но всего 8 целых чисел.

Проблема

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

Дано 32-битное целое число со знаком, обратные цифры целого числа.

Мы знаем, что это 32-битное целое число с 32 нулями и единицами, самая первая из которых обозначает знак.
Работая с 31 битом, который может представлять значение числа, самое большое положительное двоичное целое число, которое мы могли бы иметь, было бы 31 единицей после первого знакового бита нуля, что дает нам положительный знак.

Это означает, что наибольшее десятичное число, с которым мы могли бы иметь дело, было бы 2 31 - 1, или 2 147 483 647

Самое большое отрицательное двоичное целое число (и под наибольшим я имею в виду наименьшее?) будет состоять из 31 нуля, а знаковый бит равен единице, что говорит нам о том, что оно отрицательное.

Это означает, что наименьшее десятичное число, с которым мы могли бы иметь дело, было бы -2 31 или -2 147 483 648

Решение

Проблема, по сути, заключается в том, чтобы убедиться, что мы не возвращаем число, которое нельзя сохранить в виде 32-битного целого числа со знаком. Здесь мы пропускаем то, как на самом деле решить эту проблему, и сосредотачиваемся на диапазоне, так как я рассматривал решение ранее.

Строка непосредственно перед возвратом проверяет, находится ли конечное целое число, содержащееся в reversed, в пределах допустимого диапазона. Если значение reversed больше 2 31 - 1 ИЛИ меньше -2 31 , возвращается 0.

Если бы это было 32-разрядное целое число без знака, диапазон значений составлял бы от 0 до 2 32 -1, или 4 294 967 295. Этот верхний диапазон в два раза превышает диапазон 2 31 . Вы можете думать о том, что недостающая «половина» диапазона, в которой хранились бы эти положительные числа, использовалась вместо этого для хранения ваших отрицательных чисел. Диапазон того же размера, только разные начальная и конечная точки в этом диапазоне.

На этом моя серия статей о двоичных числах для обычных обладателей степени, не связанной с информатикой, заканчивается!

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

Я хочу, чтобы это стало хорошей отправной точкой для тех, кто хочет знать основы, поэтому, если есть что-то непонятное (или я предположил, что вы знаете что-то, чего не знали), дайте мне знать!< /p>

Знаки флага используются категорией представления со знаком для обозначения отрицательных целых чисел. Категории данных без знака не используют такие знаки, поскольку они могут включать только ноль и все остальные положительные значения. Различие между «подписанным» и «неподписанным» важно для правильной работы компьютерного приложения.

Читатели, которые читают это, также читают:

Подписанные и неподписанные

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

В компьютерном программировании эти категории "со знаком" и "без знака" относятся к переменным, которые могут содержать определенные типы целых чисел. В контексте кодирования первая категория может содержать оба типа целых чисел, а вторая категория может включать только число ноль и весь список положительных целых чисел.

Таблица сравнения между подписанными и неподписанными

Что такое подпись?

Представление чисел со знаком – это категоризация как положительных, так и отрицательных целых чисел. Группы данных со знаком состоят из чисел по обе стороны от числовой строки. Отрицательные числа отличаются от положительных знаком флажка.

Группы чисел со знаком используются в компьютерном программировании. Существует три метода представления наборов данных со знаком. В методе знака-величины один бит зарезервирован для символа знака. Это делает этот метод неоднозначным.

Аналогично, метод дополнения до 1 также является неоднозначным методом представления целых чисел со знаком. Метод дополнения до 2 — единственный однозначный метод, который можно использовать для представления этих целых чисел. Такие типы данных широко использовались при разработке таких языков программирования, как C и C+.

Что такое неподписанный?

Категории данных без знака — это, по сути, классификации положительных целых чисел. Они содержат исключительно положительные значения. Ноль также является частью беззнаковой категоризации. Наборы данных без знака не имеют флагов перед включенными целыми числами, так как все значения положительные.

Типы данных без знака могут представлять только величину двоичного числа, которое они представляют. Это означает, что каждое число имеет только одну двоичную эквивалентную форму. Поэтому такая форма представления называется однозначным способом представления.Кроме того, переменные без знака имеют вдвое большую величину, чем их аналоги со знаком того же диапазона.

Основные различия между подписанным и неподписанным

  1. Основное различие между знаковыми и беззнаковыми типами данных заключается в том, что первый позволяет пользователю представлять как положительные, так и отрицательные числа, а второй используется для представления нуля и других положительных чисел. Отрицательные числа не могут быть представлены беззнаковыми типами данных. Их можно использовать исключительно для положительных целых чисел.
  2. Хотя одинаковые типы переменных со знаком и без знака имеют одинаковый диапазон, последний представляет большую величину числа, чем соответствующая переменная со знаком.
  3. Категоризация данных со знаком использует знак флага перед отрицательными числами, которые он представляет. Такой знак флага не используется категорией данных без знака, поскольку он представляет только положительные числа.
  4. Две категории также различаются индивидуальными диапазонами в контексте char. Целые числа со знаком находятся в диапазоне от -128 до 127 в символах, а целые числа без знака — в диапазоне от 0 до 255 в символах.
  5. Еще одно различие между ними заключается в используемом методе идентификации. Ведущий бит данного значения используется как часть значения категорией данных без знака, чтобы определить, является ли число положительным или отрицательным. В качестве альтернативы подписанные типы данных используют оставшийся бит для такой же идентификации.
  6. Метод дополнения 1, метод дополнения 2 и метод формы знак-величина могут использоваться для представления переменных со знаком, поскольку некоторые двоичные переменные имеют отрицательный знак флага. В то время как двоичные переменные категории без знака представляют только свои величины, поскольку все они являются положительными целыми числами.
  7. Двоичные целые числа со знаком имеют три возможных метода представления, но только один метод однозначного представления, в то время как двоичные числа без знака имеют один метод представления, который, в свою очередь, является однозначным.

Заключение

Двоичные коды используются для программирования. Они также используются компьютерами для хранения и доступа к данным. Для этого используются два типа данных: подписанные и беззнаковые. Категории подписанных данных могут включать как положительные, так и отрицательные значения.

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

Целые числа со знаком используют символы флага для обозначения отрицательных целых чисел. Типы данных без знака не используют такие символы флажков, поскольку все целые числа, включенные в эту категорию, всегда положительны.

Это фундаментальное различие между ними необходимо осознавать, чтобы воздерживаться от их неправильного использования. Если две категории данных используются неправильно или их использование объединено таким образом, что это влияет на программирование устройства, компьютер обычно выдает предупреждение, уведомляя пользователя о необходимости исправить опасения.

Переменные, такие как целые числа, могут быть представлены двумя способами: со знаком и без знака. Числа со знаком используют флаг знака или могут различать отрицательные значения и положительные значения. В то время как беззнаковые числа сохраняют только положительные числа, но не отрицательные.

Методы представления чисел, такие как двоичные, восьмеричные, десятичные и шестнадцатеричные числа, могут представлять числа как со знаком, так и без знака. Двоичная система счисления является одним из типов методов представления чисел. Он наиболее популярен и используется в цифровых системах. Двоичная система используется для представления двоичных величин, которые могут быть представлены любым устройством, имеющим только два рабочих состояния или возможных состояния. Например, переключатель имеет только два состояния: открыто или закрыто.

В двоичной системе существует только два символа или возможных числовых значения, т. е. 0 и 1. Любое устройство представлено только двумя рабочими состояниями или возможными условиями. Двоичные числа обозначаются добавлением либо префикса 0b, либо суффикса 2.

Представление двоичных чисел:

Двоичные числа могут быть представлены как со знаком, так и без знака. Двоичные числа без знака не имеют бита знака, тогда как двоичные числа со знаком также используют бит со знаком, или они могут быть различимы между положительными и отрицательными числами. Двоичный файл со знаком — это особый тип данных переменной со знаком.

<р>1. Номера без знака:

Числа без знака не имеют знака, они могут содержать только величину числа. Таким образом, представление беззнаковых двоичных чисел - это только положительные числа. Например, представление положительных десятичных чисел положительно по умолчанию. Мы всегда предполагаем, что перед каждым числом стоит положительный знак.

Представление двоичных чисел без знака:

Поскольку в этом двоичном числе без знака нет бита знака, двоичное число N бит представляет только его величину.Ноль (0) также является беззнаковым числом. Это представление имеет только один нуль (0), который всегда положителен. Каждое число в представлении числа без знака имеет только одну уникальную двоичную эквивалентную форму, поэтому это метод однозначного представления. Диапазон двоичных чисел без знака: от 0 до (2 n -1).

Пример 1. Представление десятичного числа 92 в беззнаковом двоичном числе.

Просто преобразуйте его в двоичное число, оно содержит только величину заданного числа.
= (92)10

= (1x2 6 +0x2 5 +1x2 4 +1x2 3 +1x2 2 +0x2 1 +0x2 0 )10

Это 7-битная двоичная величина десятичного числа 92.

Пример 2. Найдите диапазон 5-битных двоичных чисел без знака. Также найдите минимальное и максимальное значение в этом диапазоне.

Поскольку диапазон беззнакового двоичного числа от 0 до (2 n -1). Следовательно, диапазон 5-битного двоичного числа без знака составляет от 0 до (2 5 -1), что равно от минимального значения 0 (т.е. 00000) до максимального значения 31 (т.е. 11111). <р>2. Подписанные номера:

Числа со знаком содержат флаг знака, это представление различает положительные и отрицательные числа. Этот метод содержит как бит знака, так и величину числа. Например, при представлении отрицательных десятичных чисел нам нужно поставить отрицательный символ перед заданным десятичным числом.

Представление двоичных чисел со знаком:

2.(a) Форма «знак-величина»:

Для n-битного двоичного числа 1 бит зарезервирован для символа знака. Если значение бита знака равно 0, то данное число будет положительным, иначе, если значение бита знака равно 1, то заданное число будет отрицательным. Оставшиеся (n-1) биты представляют величину числа. Поскольку величина числа ноль (0) всегда равна 0, то может быть два представления числа ноль (0), положительное (+0) и отрицательное (-0), что зависит от значения знакового бита. Следовательно, эти представления неоднозначны в основном из-за двух представлений числа ноль (0). Обычно бит знака является старшим битом (MSB) представления. Диапазон формы знак-величина: от (2 (n-1) -1) до (2 (n-1) -1).

Например, диапазон 6-битного двоичного числа со знаком-значением составляет от (2 5 -1) до (2 5 -1), что равно от минимального значения -31 (т. е. 1 11111) до максимального значения +31. (т.е. 0 11111). Нуль (0) имеет два представления: -0 (т. е. 1 00000) и +0 (т. е. 0 00000).

2.(b) Форма дополнения до 1:

Поскольку дополнение числа до 1 получается путем инвертирования каждого бита данного числа. Итак, мы представляем положительные числа в двоичной форме, а отрицательные — в форме дополнения до 1. Есть дополнительный бит для представления знака. Если значение знакового бита равно 0, то число положительное, и вы можете напрямую представить его в простой двоичной форме, но если значение знакового бита равно 1, то число отрицательное, и вы должны взять дополнение до 1 данного двоичного числа. Вы можете получить отрицательное число с помощью дополнения до 1 положительного числа и положительного числа с помощью дополнения до 1 отрицательного числа. Следовательно, в этом представлении ноль (0) может иметь два представления, поэтому форма дополнения до 1 также является неоднозначной формой. Диапазон формы дополнения до единицы: от (2 (n-1) -1) до (2 (n-1) -1) .

Например, диапазон 6-битного дополнения до 1 в форме двоичного числа составляет от (2 5 -1) до (2 5 -1), что равно от минимального значения -31 (т. е. 1 00000) до максимального значения +31 ( то есть 0 11111). Нуль (0) имеет два представления: -0 (т. е. 1 11111) и +0 (т. е. 0 00000).

2.(c) Форма дополнения до 2:

Поскольку дополнение числа до 2 получается путем инвертирования каждого бита данного числа плюс 1 до младшего значащего бита (LSB). Итак, мы представляем положительные числа в двоичной форме, а отрицательные числа — в форме дополнения до 2. Есть дополнительный бит для представления знака. Если значение бита знака равно 0, то число положительное, и вы можете напрямую представить его в простой двоичной форме, но если значение бита знака равно 1, то число отрицательное, и вы должны взять дополнение до 2 данного двоичного числа. Вы можете получить отрицательное число с помощью дополнения до 2 положительного числа и положительного числа, напрямую используя простое двоичное представление. Если значение старшего бита (MSB) равно 1, то брать дополнение до 2, иначе нет. Следовательно, в этом представлении ноль (0) имеет только одно (единственное) представление, которое всегда положительно. Диапазон формы дополнения до двойки: от (2 (n-1) ) до (2 (n-1) -1).

Правильно ли я говорю, что разница между целым числом со знаком и целым числом без знака заключается в следующем:

  1. Unsigned может содержать большее положительное значение и не содержать отрицательного значения.
  2. В версии без знака начальный бит используется как часть значения, а в версии со знаком используется крайний левый бит, чтобы определить, является ли число положительным или отрицательным.
  3. Целые числа со знаком могут содержать как положительные, так и отрицательные числа.

Есть ли другие отличия?

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

17 ответов 17

Неподписанный может содержать большее положительное значение и не содержать отрицательного значения.

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

Существуют разные способы представления целых чисел со знаком. Проще всего визуализировать, используя крайний левый бит в качестве флага (знака и величины), но более распространенным является дополнение до двух. Оба используются в большинстве современных микропроцессоров — с плавающей запятой используются знак и величина, а в целочисленной арифметике используется дополнение до двух.

Целые числа со знаком могут содержать как положительные, так и отрицательные числа.

Не уверен, что это именно тот текст, но нашел другую ссылку. Перейдите на 9-ю страницу PDF-файла (на самом деле это 38-я страница книги), и вы увидите раздел «Представление данных» (раздел 1.3). В нем есть объяснение всему сказанному выше. lms.uop.edu.jo/lms/pluginfile.php/2420/mod_resource/content/1/…

Я расскажу о различиях на аппаратном уровне на платформе x86. Это в основном не имеет значения, если вы не пишете компилятор или не используете язык ассемблера. Но приятно знать.

Во-первых, x86 имеет встроенную поддержку представления чисел со знаком в дополнении до двух. Вы можете использовать другие представления, но это потребует дополнительных инструкций и, как правило, будет пустой тратой процессорного времени.

Что я имею в виду под "встроенной поддержкой"? В основном я имею в виду, что есть набор инструкций, которые вы используете для чисел без знака, и другой набор, который вы используете для чисел со знаком. Беззнаковые числа могут находиться в тех же регистрах, что и числа со знаком, и действительно, вы можете смешивать подписанные и беззнаковые инструкции, не беспокоя процессор. Компилятор (или программист на ассемблере) должен отслеживать, подписано число или нет, и использовать соответствующие инструкции.

Во-первых, числа в дополнении до двух обладают тем свойством, что сложение и вычитание выполняются точно так же, как и для чисел без знака. Неважно, положительные числа или отрицательные. (Так что просто продолжайте и ДОБАВЛЯЙТЕ и ПОДПИСЫВАЙТЕ свои номера, не беспокоясь.)

Различия начинают проявляться, когда дело доходит до сравнений. x86 имеет простой способ различать их: выше/ниже указывает на сравнение без знака, а больше/меньше указывает на сравнение со знаком. (Например, JAE означает "Перейти, если выше или равно" и не имеет знака.)

Есть также два набора инструкций умножения и деления для работы с целыми числами со знаком и без знака.

Наконец: если вы хотите проверить, например, переполнение, вы должны сделать это по-разному для чисел со знаком и для чисел без знака.

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

Без знака: состоит только из неотрицательных значений, т. е. от 0 до 255.

Подписано: содержит как отрицательные, так и положительные значения, но в разных форматах, например

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

беззнаковые значения от 0 до 255

Диапазон значений

подписанных от -128 до 127

Несколько пунктов для полноты картины:

в этом ответе обсуждаются только целочисленные представления. Могут быть другие ответы для плавающей запятой;

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

При использовании дополнения до двух переменная может представлять больший диапазон (на единицу) отрицательных чисел, чем положительных чисел. Это связано с тем, что ноль включен в «положительные» числа (поскольку бит знака не установлен на ноль), но не входит в отрицательные числа. Это означает, что абсолютное значение наименьшего отрицательного числа не может быть представлено.

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

Если я напишу unsigned int a = -2 и signed int b = -2, базовое представление будет таким же, я знаю, что нехорошо иметь беззнаковое число с отрицательным значением, но все же, если я его дам, что будет базовым представлением ?

Все верно, кроме пункта 2. Существует множество различных обозначений для целых чисел со знаком, некоторые реализации используют первое, другие - последнее, а третьи используют что-то совершенно другое. Все зависит от платформы, с которой вы работаете.

маленький vs.big endian имеет отношение к порядку байтов на платформе. С прямым порядком байтов может выполняться 0xFF 0xFE 0x7F, а с прямым порядком байтов — 0x7F 0xFE 0xFF.

Еще одно отличие заключается в преобразовании целых чисел разного размера.

Например, если вы извлекаете целое число из потока байтов (скажем, 16 битов для простоты) со значениями без знака, вы можете сделать следующее:

(вероятно, следует преобразовать 2-й байт, но я предполагаю, что компилятор сделает все правильно)

С подписанными значениями вам придется побеспокоиться о расширении знака и сделать следующее:

Помимо того, что говорили другие, в C вы не можете переполнить целое число без знака; поведение определяется как модульная арифметика. Вы можете переполнить целое число со знаком, и теоретически (но не на практике в современных основных системах) переполнение может вызвать ошибку (возможно, аналогичную ошибке деления на ноль).

Обратите внимание, что переполнение целого числа со знаком вызывает неопределенное поведение, и современные компиляторы очень агрессивно относятся к обнаружению этого и использованию его для изменения вашей программы неожиданными, но технически законными способами, поскольку им разрешено предполагать, что неопределенное поведение не произойдет — грубо говоря. Сейчас это гораздо более серьезная проблема, чем 7 лет назад.

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

Целые числа со знаком в C представляют числа. Если a и b являются переменными целочисленных типов со знаком, стандарт никогда не будет требовать, чтобы компилятор заставлял выражение a+=b сохранять в a что-либо, кроме арифметической суммы их соответствующих значений. Безусловно, если арифметическая сумма не помещается в , процессор может не поместить ее туда, но стандарт не требует, чтобы компилятор усекал или переносил значение или делал что-либо еще. иначе если на то пошло, если значения превышают пределы для их типов. Обратите внимание, что хотя стандарт этого не требует, реализациям C разрешено перехватывать арифметические переполнения со значениями со знаком.

Целые числа без знака в C ведут себя как абстрактные алгебраические кольца целых чисел, конгруэнтных по модулю некоторой степени двойки, за исключением сценариев, включающих преобразования в более крупные типы или операции с ними. Преобразование целого числа любого размера в 32-битный беззнаковый тип даст член, соответствующий вещам, которые конгруэнтны этому целому модулю 4 294 967 296. Причина, по которой вычитание 3 из 2 дает 4 294 967 295, заключается в том, что прибавление чего-то, соответствующего 3, к чему-то, сравнимому с 4 294 967 295, даст что-то, сравнимое с 2.

Абстрактные алгебраические типы колец часто бывают удобными; к сожалению, C использует сигнатуру как решающий фактор для того, должен ли тип вести себя как кольцо. Хуже того, значения без знака обрабатываются как числа, а не элементы кольца при преобразовании в более крупные типы, а значения без знака, меньшие, чем int, преобразуются в числа, когда над ними выполняются какие-либо арифметические действия. Если v является uint32_t, равным 4 294 967 294 , тогда v*=v; должно получиться v=4 . К сожалению, если int 64 бита, то нельзя сказать, что v*=v; мог бы сделать.

Учитывая существующий стандарт, я бы предложил использовать типы без знака в ситуациях, когда требуется поведение, связанное с алгебраическими кольцами, и типы со знаком, когда нужно представлять числа. К сожалению, C провел различия именно так, как это было сделано, но они такие, какие есть.

  1. Да, целое число без знака может хранить большое значение.
  2. Нет, существуют разные способы отображения положительных и отрицательных значений.
  3. Да, целое число со знаком может содержать как положительные, так и отрицательные значения.

(отвечая на второй вопрос) Используя только знаковый бит (а не дополнение до 2), вы можете получить -0. Не очень красиво.

Целые числа без знака с гораздо большей вероятностью застанут вас в определенной ловушке, чем целые числа со знаком. Ловушка возникает из-за того, что хотя 1 и 3 выше верны, обоим типам целых чисел может быть назначено значение, выходящее за пределы того, что они могут «удерживать», и они будут преобразованы без вывода сообщений

Когда вы запустите это, вы получите следующий вывод, даже несмотря на то, что обоим значениям было присвоено -1 и они были объявлены по-разному.

Единственная гарантированная разница между значением со знаком и значением без знака в C состоит в том, что значение со знаком может быть отрицательным, 0 или положительным, а значение без знака может быть только 0 или положительным. Проблема в том, что C не определяет формат типов (поэтому вы не знаете, что ваши целые числа находятся в дополнении до двух). Строго говоря, первые два пункта, которые вы упомянули, неверны.

При программировании для встроенных систем необходимо использовать целые числа без знака. В циклах, когда нет необходимости в целых числах со знаком, использование целых чисел без знака позволит сохранить безопасность, необходимую для проектирования таких систем.

Лучший ответ, который я нашел по этому поводу, был благодаря тому, что IBM процитировала стандарт XDR:

Целое число

Целое число со знаком XDR – это 32-разрядный фрагмент данных, кодирующий целое число в диапазоне [-2147483648,2147483647]. Целое число представляется в виде дополнения до двух. Старшие и младшие байты равны 0 и 3 соответственно. Описание данных целых чисел — целое число.

Целое число без знака

Целое число без знака XDR — это 32-разрядная часть данных, которая кодирует неотрицательное целое число в диапазоне [0,4294967295]. Он представлен беззнаковым двоичным числом, старший и младший значащие байты которого равны 0 и 3 соответственно. Описание данных целых чисел без знака не имеет знака.

см. Стандарт XDR в Википедии

Это все о моделировании: когда вы хотите спроектировать компьютер, вам нужно принять соглашения о том, как вы представляете данные и как вы их вычисляете. И, конечно же, предоставлять разные модели с разными операциями и свойствами (производительность, требуемый объем памяти, сложность аппаратной реализации и т. д.)

Оказалось, что при вычислениях, основанных на электричестве (то есть электронике), наиболее удобным способом представления информации, который мы обнаружили, является использование уровня напряжения. . И самый удобный способ вычислений с этим уровнем напряжения - это рассмотрение двух состояний: наличие напряжения и отсутствие напряжения. А вот и «бит».

Вот почему мы используем двоичный код для представления чисел: последовательность электронных контактов с высоким напряжением (1) или низким напряжением (0).

Однако, если вы считаете в двоичном формате, вы можете представлять только натуральные числа (0, 1, 2, . ). Ровно 2^n (где n – количество имеющихся у вас битов) чисел.

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

Затем пришли какие-то умники и спросили: "Что произойдет, если сделать n - m с m > n, используя точно такой же алгоритм?"

<р>. И что происходит, так это то, что это на самом деле работает: вам просто нужно добавить единицу к вашему числу, если после этого у вас есть перенос (обтекание), и учтите, что и 0, 0, и 1, 1 представляет 0. Это дополнение до единиц. Однако при этом вы должны зарезервировать один бит для знака. Технически вы можете представлять значения из -(2^(n-1)-1) ≤ n ≤ 2^(n-1)-1, которые являются: (2^n)-1 (два представления для 0). В этом представлении вам просто нужно поменять местами все биты, чтобы инвертировать число.

Затем пришли еще более умные ребята и сказали: "Что, если мы учтем, что при отрицании числа всегда возникает перенос?" . Это означает, что вы добавляете один после того, как поменяли местами биты. И вы получаете дополнение до двух. Дополнение до двух. Используя его, ваш ноль имеет только одно представление, и вы снова можете представлять 2 ^ n чисел (с 2 ^ (n-1) ≤ n ≤ 2 ^ (n-1)-1). Кроме того, вычисление a-b на самом деле просто a+(-b) , что требует только двух видов операций: add(a, add(swap(b), 1)))

Еще одна приятная особенность дополнения до 2 заключается в том, что алгоритм сложения такой же, как и у беззнакового. Поэтому вы получаете одни и те же свойства и используете одно и то же оборудование для обоих. Вот почему это представление используется на большинстве компьютеров.

Затем используйте тот или иной вариант в зависимости от контекста (однако обратите внимание, что для некоторых операций, например , обработка при приведении отличается: ((signed) -1), но ((unsigned) -1) > 5

Каждый программист должен понимать знаковые и беззнаковые числа и их значение. Положительные числа представлены как числа без знака. Поэтому нам не нужно использовать перед ними знак +ve. Однако, когда дело доходит до отрицательных чисел, мы используем знак -ve. Это показывает, что число отрицательно и отличается от положительного беззнакового значения. Вот почему он представлен в виде чисел со знаком.

Числа со знаком и без знака

До сих пор мы рассматривали только положительные значения двоичных чисел. Когда фиксированное двоичное число используется для хранения положительных значений, оно считается беззнаковым. В этом случае диапазон положительных значений, которые могут быть представлены, составляет от 0 до 2 n -1, где n — количество используемых битов. Также можно представлять числа со знаком (как отрицательные, так и положительные) в двоичном формате. В этом случае некоторая часть общего диапазона значений используется для представления положительных значений, а оставшаяся часть диапазона используется для представления отрицательных значений.

Существует несколько способов представления чисел со знаком в двоичном формате, но наиболее часто используемое представление называется методом дополнения до двух. Термин «дополнение до двух» несколько неоднозначен, поскольку используется двумя разными способами. Во-первых, как представление, дополнение до двух — это способ интерпретации и присвоения значения битовому шаблону, содержащемуся в двоичной величине с фиксированной точностью.Во-вторых, термин «дополнение до двух» также используется для обозначения операции, которая может быть выполнена над битами двоичной величины. В качестве операции дополнение числа до двух формируется путем инвертирования всех битов и добавления к нему 1. В двоичном числе, интерпретируемом с использованием представления дополнения до двух, старший бит числа указывает на знак. Если бит знака равен 0, число положительное, а если бит знака равно 1, число отрицательное. Для положительных чисел остальные биты содержат истинную величину числа. Для отрицательных чисел младшие биты содержат величину числа. Важно отметить, что представление с дополнением до двух может применяться только к величинам с фиксированной точностью, т. е. к величинам с заданным числом битов.

Используется метод представления с дополнением до 2, поскольку он снижает сложность аппаратного обеспечения АЛУ (арифметико-логического блока) ЦП компьютера. При использовании метода дополнения до 2 все арифметические операции могут выполняться одним и тем же оборудованием независимо от того, считаются ли числа беззнаковыми или знаковыми. Выполняемые битовые операции идентичны; разница возникает из-за интерпретации битов. Интерпретация значения будет различаться в зависимости от того, считается ли значение беззнаковым или подписанным.

В приведенной выше таблице мы считаем от 0 . При достижении 127 следующий двоичный шаблон в последовательности соответствует -128. Значения от наибольшего положительного числа до наибольшего отрицательного числа, но после этого последовательность соответствует ожидаемой. Скажем, например, добавление 1 к –128 дает –127. Когда счетчик достигает FF h (или максимально возможной величины без знака), счетчик возвращается к 0 . Скажем, например, добавление 1 к –1 дает 0 . Это все для подписанных и неподписанных чисел в компьютерном программировании. Если у вас есть какие-либо вопросы, не стесняйтесь оставлять комментарии.

Читайте также: