Подписанный по сравнению с целыми числами без знака

378
задан Shimmy 30 October 2014 в 18:51
поделиться

8 ответов

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

Да.

Неподписанное использование ведущий бит как часть значения, в то время как подписанная версия использует left-most-bit, чтобы определить, положительно ли число или отрицательно.

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

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

Да

331
ответ дан NonameSL 22 November 2019 в 23:57
поделиться

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

4
ответ дан exitcode 22 November 2019 в 23:57
поделиться

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

4
ответ дан Jonathan Leffler 22 November 2019 в 23:57
поделиться

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

11
ответ дан Jasper Bekkers 22 November 2019 в 23:57
поделиться

Всего несколько точек для полноты:

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

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

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

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

15
ответ дан Michael Burr 22 November 2019 в 23:57
поделиться

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

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

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

Во-первых, дополнительные числа two имеют свойство, что дополнение и вычитание все равно что касается неподписанных чисел. Это не имеет никакого значения, положительны ли числа или отрицательны. (Таким образом, Вы просто идете вперед и ADD и SUB Ваши числа без беспокойства.)

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

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

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

89
ответ дан compie 22 November 2019 в 23:57
поделиться

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

4
ответ дан toddk 22 November 2019 в 23:57
поделиться

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

0
ответ дан 22 November 2019 в 23:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: