Decidí dejar esta respuesta ya que las implementaciones de C y C ++ generalmente están estrechamente relacionadas, pero de hecho no difiere del estándar C como pensé. El punto es que el estándar C ++ no especifica lo que sucede en casos como estos. También es relevante que las representaciones que no son de complemento a dos son extremadamente raras en el mundo real, y que incluso donde existen, a menudo ocultan la diferencia en muchos casos en lugar de exponerla como algo que alguien podría esperar descubrir fácilmente.
El comportamiento de los ceros negativos en las representaciones enteras en las que existen no está tan rigurosamente definido en el estándar C ++ como lo está en el estándar C. Sin embargo, sí cita la norma C (ISO / IEC 9899: 1999) como referencia normativa en el nivel superior [1.2].
En el estándar C [6.2.6.2], un cero negativo solo puede ser el resultado de operaciones bit a bit o de operaciones en las que ya está presente un cero negativo (por ejemplo, multiplicar o dividir un cero negativo por un valor, o agregar un cero negativo a cero): la aplicación del operador menos unario a un valor de un cero normal, como en su ejemplo, está garantizado para dar como resultado un cero normal.
Incluso en los casos que pueden generar un cero negativo, no hay garantía de que lo harán, incluso en un sistema que admite cero negativo:
No se especifica si estos casos generan realmente un cero negativo o un cero normal, y si un cero negativo se convierte en un cero normal cuando se almacena en un objeto.
Por tanto, podemos concluir: no, no existe una forma fiable de detectar este caso. Incluso si no fuera por el hecho de que las representaciones de complemento no a dos son muy poco comunes en los sistemas informáticos modernos.
El estándar C ++, por su parte, no menciona el término "cero negativo" y tiene muy poca discusión sobre los detalles de la magnitud con signo y las representaciones de complemento a uno, excepto para notar [3.9.1 párrafo 7] que están permitidos.