Postanowiłem pozostawić tę odpowiedź, ponieważ implementacje C i C ++ są zwykle ściśle powiązane, ale w rzeczywistości nie odstają od standardu C, jak myślałem. Chodzi o to, że standard C ++ nie określa, co się dzieje w takich przypadkach. Istotne jest również to, że reprezentacje dopełniające inne niż dwójki są niezwykle rzadkie w prawdziwym świecie, a nawet tam, gdzie istnieją, często ukrywają różnicę w wielu przypadkach, zamiast ujawniać ją jako coś, czego ktoś mógłby z łatwością oczekiwać.
Zachowanie zer ujemnych w reprezentacjach liczb całkowitych, w których istnieją, nie jest tak rygorystycznie zdefiniowane w standardzie C ++, jak w standardzie C. Cytuje jednak normę C (ISO / IEC 9899: 1999) jako odniesienie normatywne na najwyższym poziomie [1.2].
W standardzie C [6.2.6.2] ujemne zero może być wynikiem tylko operacji bitowych lub operacji, w których ujemne zero jest już obecne (na przykład mnożenie lub dzielenie ujemnego zera przez wartość lub dodanie ujemnego zera do zero) - zastosowanie jednoargumentowego operatora minus do wartości normalnego zera, tak jak w twoim przykładzie, gwarantuje zatem normalne zero.
Nawet w przypadkach, które mogą wygenerować ujemne zero, nie ma gwarancji, że tak się stanie, nawet w systemie, który obsługuje ujemne zero:
Nie jest określone, czy te przypadki faktycznie generują ujemne zero, czy normalne zero i czy ujemne zero staje się normalnym zerem, gdy jest przechowywane w obiekcie.
Dlatego możemy stwierdzić: nie, nie ma niezawodnego sposobu na wykrycie tego przypadku.Nawet gdyby nie fakt, że reprezentacje z dopełnieniem innym niż dwójki są bardzo rzadkie w nowoczesnych systemach komputerowych.
Standard C ++ ze swojej strony nie wspomina o terminie „ujemne zero” i zawiera bardzo mało dyskusji na temat szczegółów wielkości ze znakiem i reprezentacji dopełnień, z wyjątkiem uwagi [3.9.1 akapit 7], że są one dozwolone.