Decidi deixar essa resposta aberta, pois as implementações de C e C ++ costumam estar intimamente relacionadas, mas na verdade ela não segue o padrão C como pensei. A questão é que o padrão C ++ não especifica o que acontece em casos como esses. Também é relevante que representações que não sejam de complemento de dois sejam extremamente raras no mundo real e que, mesmo onde existem, muitas vezes escondem a diferença em muitos casos, em vez de expô-la como algo que alguém poderia facilmente esperar descobrir.
O comportamento dos zeros negativos nas representações de inteiros em que existem não é definido com tanto rigor no padrão C ++ como no padrão C. No entanto, ele cita o padrão C (ISO / IEC 9899: 1999) como uma referência normativa no nível superior [1.2].
No padrão C [6.2.6.2], um zero negativo só pode ser o resultado de operações bit a bit, ou operações onde um zero negativo já está presente (por exemplo, multiplicar ou dividir zero negativo por um valor, ou adicionar um zero negativo a zero) - a aplicação do operador menos unário a um valor de zero normal, como em seu exemplo, garante, portanto, um zero normal.
Mesmo nos casos que podem gerar um zero negativo, não há garantia de que o farão, mesmo em um sistema que suporta zero negativo:
Não é especificado se esses casos realmente geram um zero negativo ou um zero normal e se um zero negativo se torna um zero normal quando armazenado em um objeto.
Portanto, podemos concluir: não, não existe uma maneira confiável de detectar este caso. Mesmo que não seja pelo fato de que representações que não sejam de complemento de dois são muito incomuns em sistemas de computador modernos.
O padrão C ++, por sua vez, não faz menção ao termo "zero negativo", e tem muito pouca discussão sobre os detalhes de magnitude sinalizada e representações de complemento de alguém, exceto para observar [3.9.1 para 7] que eles são permitidos.