Я вирішив залишити цю відповідь, оскільки реалізації С та С ++ зазвичай тісно пов’язані, але насправді це не відповідає стандарту С, як я думав. Справа залишається в тому, що стандарт C ++ не визначає, що відбувається у таких випадках. Також доречно, що подання, що не доповнюють два, надзвичайно рідкісні у реальному світі, і що навіть там, де вони існують, вони часто приховують різницю в багатьох випадках, а не виставляють її як щось, що хтось може легко очікувати виявити.
Поведінка від’ємних нулів у цілочисельних представленнях, у яких вони існують, не настільки суворо визначена у стандарті С ++, як у стандарті С. Однак він посилається на стандарт С (ISO / IEC 9899: 1999) як нормативне посилання на верхньому рівні [1.2].
У стандарті C [6.2.6.2] від’ємний нуль може бути результатом побітових операцій або операцій, де вже присутній від’ємний нуль (наприклад, множення або ділення від’ємного нуля на значення або додавання від’ємного нуля до нуль) - застосування одинарного мінусового оператора до значення нормального нуля, як у вашому прикладі, гарантовано приведе до нормального нуля.
Навіть у тих випадках, коли може генеруватися від’ємний нуль, немає жодної гарантії, що вони будуть, навіть у системі, яка підтримує від’ємний нуль:
Не визначено, чи справді ці випадки генерують від’ємний нуль чи нормальний нуль, і чи від’ємний нуль стає нормальним нулем при зберіганні в об’єкті.
Тому можна зробити висновок: ні, немає надійного способу розкрити цю справу. Навіть якби не той факт, що подання, що не доповнюють двійки, дуже рідкісні в сучасних комп’ютерних системах.
Стандарт C ++, зі свого боку, не згадує термін "негативний нуль" і дуже мало обговорює деталі підписаної величини та подання власних доповнень, за винятком того, щоб зазначити [3.9.1, пункт 7], що вони дозволені.