Существуют ли какие-либо реализации, которые поддерживают отрицательный нуль или резервируют его как представление ловушки?

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

Однако, как указано в 6.2.6.2p2, это не является обязательным требованием:

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

Мой первый вопрос прост: существуют ли какие-либо реализации, использующие этот битовый шаблон для представления отрицательного нуля или ловушки? Если ответ на этот вопрос «нет», то ответ на мои последующие вопросы также должен быть «нет».

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

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

Мои последующие вопросы:

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

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


person autistic    schedule 02.06.2015    source источник
comment
дополнение до единицы имеет четкий битовый шаблон для отрицательного нуля.   -  person orlp    schedule 02.06.2015
comment
Я полагаю, что UCS в OS 2200 (на мейнфреймах Unisys Clearpath Dordado, которые являются машинами с дополнением) является реализацией C, использующей дополнение, в которой +ve и -ve нуля являются отдельными битовыми шаблонами.   -  person Iskar Jarak    schedule 02.06.2015
comment
@orlp Комментарии предназначены для разъяснения, поэтому я могу только предположить, что вы хотели сформулировать это в форме вопроса. Википедия не определяет C, и первая приведенная мной цитата (которая действительно определяет по крайней мере часть C, поскольку она исходит из стандарта C) утверждает, что этот битовый шаблон может быть представлением ловушки.   -  person autistic    schedule 02.06.2015
comment
@IskarJarak Действительно интересная реализация! 18-битные целые числа... Хммм.   -  person autistic    schedule 02.06.2015
comment
@IskarJarak Действительно интересно, поскольку на самом деле он использует дополнение до двух, и в одном режиме рассматриваемое значение сравнивается с нулем в сравнениях со знаком (но не без знака), в то время как в другом режиме это максимально возможное значение (что технически не соответствует в С). Если вы ищете цитату для ответа, перейдите к 2-29... Я оставлю вам несколько дней, чтобы вы написали, если хотите, в противном случае я напишу это и отдам вам должное за то, что вы назвали реализацию :)   -  person autistic    schedule 02.06.2015
comment
@undefinedbehaviour Определенно довольно необычная реализация, это точно. Я не собираюсь писать ответ, потому что не могу ответить на ваш следующий вопрос Q1. представления-ловушки (я не знаю, существует ли такая реализация), поэтому не стесняйтесь отвечать самостоятельно.   -  person Iskar Jarak    schedule 02.06.2015
comment
@undefinedbehaviour Нет, я просто отвечал на второй пункт вашего вопроса в комментариях :)   -  person orlp    schedule 02.06.2015
comment
@IskarJarak Я не ожидаю, что кто-нибудь сможет ответить на все эти вопросы ... Кто-то может, и это хорошо для них; они получат мой любимый ответ. Однако было бы неплохо, если бы кто-нибудь еще, кто приходит к этому вопросу, мог увидеть хотя бы часть ответа.   -  person autistic    schedule 02.06.2015
comment
@orlp Если вы так уверены, опубликуйте это как ответ ... Вы можете сделать то же самое и со всеми другими вопросами. Можно сказать... 1. Да. Реализация, которая использует представление ловушки, а не отрицательный нуль, является реализацией, которая использует представление ловушки, а не отрицательный ноль... 2. Да, дополнение до единиц может хранить отрицательный ноль как отдельное значение ... 3. Да, дополнение до единицы может хранить отрицательный нуль как обычный нуль.... Посмотрите, как далеко не называть никаких реализаций (это то, о чем я просил ) получает нас?   -  person autistic    schedule 02.06.2015
comment
@undefinedbehaviour Нет никакой силы. Дополнение до единицы имеет два нуля: один положительный и один отрицательный. Битовая комбинация «все нули» — это положительный нуль, битовая комбинация «все единицы» — отрицательный нуль.   -  person orlp    schedule 02.06.2015
comment
@orlp Не могли бы вы показать мне цитату из стандарта C, пожалуйста?   -  person autistic    schedule 02.06.2015
comment
@orlp Я облегчу вам задачу ... Вы можете найти раздел стандарта C, относящийся к представлению целых чисел со знаком, выше. Я дважды ссылался на него в этом вопросе. Пожалуйста, не отвечайте до тех пор, пока у вас не будет цитаты (из стандарта C, поскольку ничто другое здесь не имеет значения), подтверждающей ваши утверждения, или пока вы не будете готовы прекратить делать сомнительные и недействительные утверждения.   -  person autistic    schedule 02.06.2015
comment
В В Википедии есть несколько примеров старых малоизвестных систем. Может быть, если вы углубитесь в характеристики этих систем...   -  person Lundin    schedule 03.06.2015


Ответы (1)


Как мне сообщил Искар Джарак в комментариях, OS2200, последний раз выпущенный в феврале 2015 г. , имеет реализацию C, известную как UCS C, из которых руководство документы

  • соответствующая реализация C, где - by "... CONFORMANCE/TWOSARITH не используется, отрицательный нуль эквивалентен нулю во всех сравнениях 36-битных целых чисел без знака с использованием меньше (‹) или равно (=). В беззнаковом сравнения с использованием больше чем (>), (236)-1 больше нуля."
  • сомнительно соответствующая реализация C, в которой «СООТВЕТСТВИЕ/ДВАСАРИТ приводит к тому, что отрицательный нуль, (236)-1, рассматривается сгенерированным кодом как большое целое число без знака». Поскольку это нарушает несколько стандартных положений C (6.2.6.2p2 заявляя "бит знака имеет значение -(2M) (дополнение до двух)" и "бит знака имеет значение -(2< sup>M-1) (дополнение до единиц)", 6.3.1.1p3, где указано "Целые рекламные акции сохраняют значение, включая знак", что противоречит преобразованию в большое целое число без знака указанный в документе UCS/OS2200), следует, что это может соответствовать только в том случае, если отрицательный нулевой битовый шаблон обрабатывается как представление ловушки, где вызывается неопределенное поведение, и поэтому ограничения стандарта больше не применяются.

В итоге, ...

Существуют ли какие-либо реализации, которые используют этот битовый шаблон для представления отрицательного нуля или ловушки?

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


Из последующих вопросов 1 и 2 следует, что UCS C на OS2200 является примером обоих из них.

Что касается вопроса 3, на который нужно будет ответить в другой день... Мое время подошло к концу :)

person autistic    schedule 21.02.2017
comment
Определяет ли эта реализация беззнаковый тип по крайней мере с 64 битами? Система дополнения, которую я рассмотрел, оказалась наиболее близкой к соответствию, имела 36-битный тип без знака и 72-битный тип со знаком, но не 72-битный тип без знака. - person supercat; 22.02.2017
comment
@supercat Мы имеем в виду одну и ту же реализацию? Если это так, то из документации следует, что это система с дополнением до двух с перехватом и/или несоответствующим шаблоном битов с отрицательным нулем. Согласно документам, указанным выше (которые утверждают последние стандарты языков программирования, хе-хе), атрибут Unsigned не разрешен для длинных длинных целых чисел, хотя для этой реализации должно быть тривиально реализовать unsigned long long... Вы правы; это похоже на проблему соответствия. - person autistic; 22.02.2017
comment
Должна быть другая система (я думал о 36-битной платформе с дополнением до единицы), но я подозреваю, что все соответствующие платформы C99 предназначены для платформ с естественной семантикой с кодированием до двух, поскольку 64-битный или более крупный беззнаковый тип быть дорогим на такой платформе, если размер ее слова не был 65 бит или больше. - person supercat; 22.02.2017
comment
Будет ли дорого отказаться от бита знака (рассматривать его как заполнение)? Как бы то ни было, эта реализация, похоже, делает это путем слияния двух long, чтобы сделать long long... Дорого! ;) - person autistic; 23.02.2017
comment
Я не знаю, действительно ли это реализация, подобная тому, о котором я читал, или эта, или вместо этого верхняя половина масштабируется на (2 ^ 36-1), а не (2 ^ 36). Если бы не требовалось, чтобы беззнаковые числа имели модуль степени двойки, можно было бы эффективно выполнять длинные беззнаковые арифметические операции по модулю (2^36-1)^2, но получить модуль степени двойки было бы намного сложнее. Обратите внимание, что даже документация обещает только диапазон 2 ^ 70-1 для значений со знаком, на самом деле он может расширяться до (2 ^ 36-1) (2 ^ 35) -1. - person supercat; 23.02.2017
comment
Использование таких операторов, как &, над числом (H:L) в не совсем двоичной базе данных потребовало бы преобразования его в двоичную форму; это, в свою очередь, потребовало бы определения того, является ли H ‹ L, H == L или H › L. Тогда результатом будет (H:LH), (H-1:0xFFFFFFFFFF) или (H-1:0xFFFFFFFFFE-( ХЛ)+1). Поскольку бинарные операторы, как правило, не очень часто используются для типов с длинным знаком, нести такие затраты при использовании этих операторов было бы гораздо более разумно, чем нести их для всех арифметических операций со знаком. - person supercat; 23.02.2017