Я решил оставить этот ответ, поскольку реализации C и C++ обычно тесно связаны, но на самом деле он не зависит от стандарта C, как я думал. Дело в том, что стандарт C++ не указывает, что происходит в таких случаях. Также имеет значение то, что представления без дополнения до двух чрезвычайно редки в реальном мире, и что даже там, где они существуют, они часто скрывают разницу во многих случаях, а не выставляют ее как нечто, что кто-то может легко обнаружить.
Поведение отрицательных нулей в целочисленных представлениях, в которых они существуют, не так строго определено в стандарте C++, как в стандарте C. Однако он ссылается на стандарт C (ISO/IEC 9899:1999) как на нормативную ссылку на верхнем уровне [1.2].
В стандарте C [6.2.6.2] отрицательный нуль может быть результатом только побитовых операций или операций, в которых отрицательный нуль уже присутствует (например, умножение или деление отрицательного нуля на значение или добавление отрицательного нуля к ноль) - поэтому применение унарного оператора минус к значению нормального нуля, как в вашем примере, гарантированно приведет к нормальному нулю.
Даже в тех случаях, когда может сгенерировать отрицательный нуль, нет гарантии, что они это сделают, даже в системе, которая поддерживает отрицательный нуль:
Не указано, действительно ли эти случаи генерируют отрицательный нуль или нормальный нуль, и становится ли отрицательный нуль нормальным нулем при сохранении в объекте.
Следовательно, мы можем сделать вывод: нет, нет надежного способа обнаружить этот случай. Даже если бы не тот факт, что представления без дополнения до двух очень редко встречаются в современных компьютерных системах.
Стандарт C++, со своей стороны, не упоминает термин «отрицательный нуль» и очень мало обсуждает детали величины со знаком и представления дополнения до единицы, за исключением примечания [3.9.1, абзац 7], что они разрешены.
person
Random832
schedule
30.04.2015
int
представлено в дополнении до 2 (наиболее часто встречающееся),0
и-0
имеют идентичные побитовые представления. - person Mankarse   schedule 30.04.2015int
. См. дополнительное кодирование единиц. - person CiaPan   schedule 30.04.20151
и-(-1)
? (и еще один для-(-(-(-1)))
, ...) - person ypercubeᵀᴹ   schedule 06.05.2015