Tôi đã quyết định để lại câu trả lời này vì việc triển khai C và C ++ thường có liên quan chặt chẽ với nhau, nhưng trên thực tế, nó không tuân theo tiêu chuẩn C như tôi nghĩ. Điểm vẫn còn là tiêu chuẩn C ++ không chỉ định điều gì xảy ra cho những trường hợp như thế này. Nó cũng có liên quan rằng các biểu diễn không bổ sung hai phần cực kỳ hiếm trong thế giới thực và ngay cả khi chúng tồn tại, chúng thường che giấu sự khác biệt trong nhiều trường hợp hơn là để lộ nó như một thứ mà ai đó có thể dễ dàng phát hiện ra.
Hành vi của các số không âm trong các biểu diễn số nguyên mà chúng tồn tại không được xác định chặt chẽ trong tiêu chuẩn C ++ như trong tiêu chuẩn C. Tuy nhiên, nó viện dẫn tiêu chuẩn C (ISO / IEC 9899: 1999) như một tài liệu tham khảo quy chuẩn ở cấp cao nhất [1.2].
Trong tiêu chuẩn C [6.2.6.2], số 0 âm chỉ có thể là kết quả của các phép toán bit hoặc các phép toán đã có số 0 âm (ví dụ: nhân hoặc chia số 0 âm cho một giá trị hoặc thêm số 0 âm vào zero) - áp dụng toán tử trừ một bậc cho giá trị của một số 0 bình thường, như trong ví dụ của bạn, do đó, được đảm bảo sẽ dẫn đến một số 0 bình thường.
Ngay cả trong những trường hợp có thể tạo ra số 0 âm, không có gì đảm bảo rằng chúng sẽ làm được, ngay cả trên một hệ thống hỗ trợ số 0 âm:
Không xác định được liệu những trường hợp này thực sự tạo ra số 0 âm hay số 0 bình thường và liệu số 0 âm có trở thành số 0 bình thường khi được lưu trữ trong một đối tượng hay không.
Do đó, chúng ta có thể kết luận: không, không có cách nào đáng tin cậy để phát hiện trường hợp này. Ngay cả khi không có thực tế là các biểu diễn không bổ sung hai phần là rất phổ biến trong các hệ thống máy tính hiện đại.
Về phần mình, tiêu chuẩn C ++ không đề cập đến thuật ngữ "số không âm" và có rất ít thảo luận về các chi tiết của cường độ có dấu và các biểu diễn bổ sung của một người, ngoại trừ lưu ý [3.9.1 đoạn 7] rằng chúng được phép.