ฉันตัดสินใจที่จะทิ้งคำตอบนี้ไว้เนื่องจากการใช้งาน C และ C ++ มักจะเกี่ยวข้องกันอย่างใกล้ชิด แต่ในความเป็นจริงมันไม่ได้คล้อยตามมาตรฐาน C อย่างที่ฉันคิด ประเด็นยังคงอยู่ที่มาตรฐาน C ++ ไม่ได้ระบุว่าจะเกิดอะไรขึ้นสำหรับกรณีเช่นนี้ นอกจากนี้ยังเกี่ยวข้องด้วยว่าการแสดงที่ไม่ใช่สองส่วนเสริมนั้นหาได้ยากมากในโลกแห่งความเป็นจริงและแม้ว่าจะมีอยู่จริง แต่ก็มักจะซ่อนความแตกต่างไว้ในหลาย ๆ กรณีแทนที่จะเปิดเผยว่าเป็นสิ่งที่ใครบางคนสามารถคาดหวังได้โดยง่าย
พฤติกรรมของศูนย์ลบในการแทนค่าจำนวนเต็มซึ่งมีอยู่นั้นไม่ได้กำหนดไว้อย่างเข้มงวดในมาตรฐาน C ++ เหมือนกับที่อยู่ในมาตรฐาน C อย่างไรก็ตามอ้างถึงมาตรฐาน C (ISO / IEC 9899: 1999) เป็นการอ้างอิงเชิงบรรทัดฐานที่ระดับบนสุด [1.2]
ในมาตรฐาน C [6.2.6.2] ศูนย์ลบสามารถเป็นผลลัพธ์ของการดำเนินการระดับบิตเท่านั้นหรือการดำเนินการที่มีศูนย์ลบอยู่แล้ว (ตัวอย่างเช่นการคูณหรือหารศูนย์ลบด้วยค่าหรือการเพิ่มศูนย์ลบให้กับ ศูนย์) - การใช้ตัวดำเนินการลบยูนารีกับค่าของศูนย์ปกติดังที่แสดงในตัวอย่างของคุณจึงรับประกันได้ว่าจะให้ผลลัพธ์เป็นศูนย์ปกติ
แม้ในกรณีที่สามารถสร้างศูนย์ลบได้ แต่ก็ไม่มีการรับประกันว่าจะทำได้แม้ในระบบที่สนับสนุนค่าลบศูนย์:
ไม่ได้ระบุว่ากรณีเหล่านี้สร้างศูนย์ลบหรือศูนย์ปกติจริงหรือไม่และศูนย์ลบจะกลายเป็นศูนย์ปกติหรือไม่เมื่อเก็บไว้ในวัตถุ
ดังนั้นเราสามารถสรุปได้: ไม่ไม่มีวิธีที่เชื่อถือได้ในการตรวจจับกรณีนี้แม้ว่าจะไม่ใช่เพราะข้อเท็จจริงที่ว่าการแสดงที่ไม่ใช่สองส่วนเสริมเป็นเรื่องผิดปกติในระบบคอมพิวเตอร์สมัยใหม่
ในส่วนของมาตรฐาน C ++ ไม่ได้กล่าวถึงคำว่า "ศูนย์ลบ" และมีการพูดถึงรายละเอียดของขนาดที่เซ็นชื่อและการแสดงส่วนเสริมน้อยมากยกเว้นหมายเหตุ [3.9.1 วรรค 7] ว่าได้รับอนุญาต