ฉันเจอรหัสจากใครบางคนที่ดูเหมือนจะเชื่อว่ามีปัญหาในการลบจำนวนเต็มที่ไม่ได้ลงชื่อออกจากจำนวนเต็มอื่นที่เป็นประเภทเดียวกันเมื่อผลลัพธ์เป็นลบ ดังนั้นรหัสแบบนี้จะไม่ถูกต้องแม้ว่าจะใช้งานได้กับสถาปัตยกรรมส่วนใหญ่ก็ตาม
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
นี่เป็นเพียงคำพูดที่เกี่ยวข้องอย่างคลุมเครือจากมาตรฐาน C ที่ฉันหาได้
การคำนวณที่เกี่ยวข้องกับตัวถูกดำเนินการที่ไม่ได้ลงนามไม่สามารถเกิน fl โอ๊ยได้เนื่องจากผลลัพธ์ที่ไม่สามารถแสดงโดยประเภทจำนวนเต็มที่ไม่ได้ลงนามที่เป็นผลลัพธ์จะลดโมดูโลจำนวนที่มากกว่าค่าที่มากที่สุดค่าหนึ่งที่สามารถแสดงโดยประเภทผลลัพธ์ได้
ฉันคิดว่าอาจใช้คำพูดนั้นเพื่อหมายความว่าเมื่อตัวถูกดำเนินการด้านขวามีขนาดใหญ่ขึ้นการดำเนินการจะถูกปรับให้มีความหมายในบริบทของตัวเลขที่ถูกตัดทอนโมดูโล
กล่าวคือ
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
เมื่อเทียบกับการใช้ความหมายที่ลงนามขึ้นอยู่กับการใช้งาน:
0x0000 - 0x0001 == (ไม่ได้ลงนาม) (0 + -1) == (0xFFFF แต่ยัง 0xFFFE หรือ 0x8001)
ข้อใดหรือการตีความที่ถูกต้อง? กำหนดไว้เลยหรือไม่?