Я решил оставить этот ответ, поскольку реализации C и C ++ обычно тесно связаны, но на самом деле он не соответствует стандарту C, как я думал. Дело в том, что стандарт C ++ не определяет, что происходит в подобных случаях. Также важно, что представления без двойного дополнения чрезвычайно редки в реальном мире, и что даже там, где они действительно существуют, они часто скрывают разницу во многих случаях, а не выставляют ее как нечто, что кто-то может легко ожидать обнаружить.
Поведение отрицательных нулей в целочисленных представлениях, в которых они существуют, не так строго определено в стандарте C ++, как в стандарте C. Однако он ссылается на стандарт C (ISO / IEC 9899: 1999) в качестве нормативной ссылки на верхнем уровне [1.2].
В стандарте C [6.2.6.2] отрицательный ноль может быть только результатом побитовых операций или операций, в которых отрицательный ноль уже присутствует (например, умножение или деление отрицательного нуля на значение или добавление отрицательного нуля к ноль) - применение унарного оператора минус к значению нормального нуля, как в вашем примере, поэтому гарантированно приведет к нормальному нулю.
Даже в случаях, когда может генерироваться отрицательный ноль, нет никакой гарантии, что они будут, даже в системе, которая поддерживает отрицательный ноль:
Неизвестно, генерируют ли эти случаи на самом деле отрицательный ноль или нормальный ноль, и становится ли отрицательный ноль нормальным нулем при сохранении в объекте.
Таким образом, можно сделать вывод: нет, надежного способа выявить этот случай нет. Даже если бы не тот факт, что представления без двоичного дополнения очень редко встречаются в современных компьютерных системах.
В стандарте C ++, в свою очередь, не упоминается термин «отрицательный ноль» и очень мало обсуждаются детали представлений величины со знаком и одного дополнения, за исключением [3.9.1, параграф 7], что они разрешены.