Вопрос

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

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

Итак, вот мой вопрос:Знаете ли вы какой-нибудь современный компилятор, который по умолчанию реализует представление дополнения или знаковой величины?Можем ли мы изменить представление по умолчанию с помощью какого-либо флага компилятора?

Каков самый простой способ определить, какое представление используется?

А как насчет стандарта C++?

Это было полезно?

Решение

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

Некоторые поля контрольной суммы в наборе протоколов IP используют дополнение, поэтому, возможно, его реализуют выделенные ЦП типа «сетевой ускоритель».

Другие советы

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

Это приводит к неопределенному поведению побитовых операций над знаковыми типами.

А Серия UNISYS 2200 который реализует дополнительную математику, все еще используется.Подробнее об этом можно прочитать в вопросах ниже.

Экзотические архитектуры, о которых заботятся комитеты по стандартизации

Существуют ли какие-либо реализации языка C без двоичного дополнения?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top