Ho deciso di lasciare questa risposta poiché le implementazioni C e C ++ sono solitamente strettamente correlate, ma in realtà non si rimanda allo standard C come pensavo. Resta il punto che lo standard C ++ non specifica cosa succede per casi come questi. È anche importante che le rappresentazioni senza complemento a due siano estremamente rare nel mondo reale e che anche dove esistono spesso nascondono la differenza in molti casi piuttosto che esporla come qualcosa che qualcuno potrebbe facilmente aspettarsi di scoprire.
Il comportamento degli zeri negativi nelle rappresentazioni di interi in cui esistono non è così rigorosamente definito nello standard C ++ come nello standard C. Tuttavia, cita lo standard C (ISO / IEC 9899: 1999) come riferimento normativo al livello più alto [1.2].
Nello standard C [6.2.6.2], uno zero negativo può essere solo il risultato di operazioni bit per bit, o operazioni in cui è già presente uno zero negativo (ad esempio, moltiplicando o dividendo lo zero negativo per un valore, o aggiungendo uno zero negativo a zero) - l'applicazione dell'operatore meno unario a un valore di uno zero normale, come nel tuo esempio, è quindi garantito che risulti in uno zero normale.
Anche nei casi che possono generare uno zero negativo, non vi è alcuna garanzia che lo faranno, anche su un sistema che supporta lo zero negativo:
Non è specificato se questi casi generano effettivamente uno zero negativo o uno zero normale e se uno zero negativo diventa uno zero normale quando viene memorizzato in un oggetto.
Pertanto, possiamo concludere: no, non esiste un modo affidabile per rilevare questo caso. Anche se non per il fatto che le rappresentazioni senza complemento a due sono molto rare nei moderni sistemi informatici.
Lo standard C ++, da parte sua, non fa menzione del termine "zero negativo", e ha pochissime discussioni sui dettagli della grandezza con segno e sulle rappresentazioni del complemento a uno, tranne per notare [3.9.1 paragrafo 7] che sono consentiti.