การเพิ่มจำนวนเต็ม 32 บิตสองตัวอาจทำให้จำนวนเต็มล้น:
uint64_t u64_z = u32_x + u32_y;
การโอเวอร์โฟลว์นี้สามารถหลีกเลี่ยงได้หากหนึ่งในจำนวนเต็ม 32 บิตถูกแคสต์หรือเพิ่มเป็นจำนวนเต็ม 64 บิตก่อน
uint64_t u64_z = u32_x + u64_a + u32_y;
อย่างไรก็ตามหากคอมไพเลอร์ตัดสินใจที่จะจัดลำดับการเพิ่มใหม่:
uint64_t u64_z = u32_x + u32_y + u64_a;
การล้นจำนวนเต็มอาจยังคงเกิดขึ้น
คอมไพเลอร์ได้รับอนุญาตให้ทำการเรียงลำดับใหม่หรือเราสามารถไว้วางใจให้คอมไพเลอร์สังเกตเห็นความไม่สอดคล้องกันของผลลัพธ์และรักษาลำดับนิพจน์ตามที่เป็นอยู่ได้หรือไม่?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
ผลลัพธ์ใน0
ขณะที่(uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
ผลลัพธ์เป็น0x100000000
และค่าทั้งสองนี้ไม่เท่ากัน ดังนั้นจึงเป็นเรื่องสำคัญที่คอมไพเลอร์สามารถใช้การแปลงนั้นได้หรือไม่ แต่ใช่มาตรฐานใช้คำว่า "ล้น" สำหรับจำนวนเต็มที่มีการลงนามเท่านั้นไม่ใช่ไม่ได้ลงนาม
uint32_t
มากเกินไปเพราะดูเหมือนว่าคุณจะถูกเพิ่ม- ซึ่งจะไม่ล้นเกิน สิ่งเหล่านี้ไม่ใช่พฤติกรรมที่แตกต่างกัน