Thêm hai số nguyên 32 bit có thể dẫn đến tràn số nguyên:
uint64_t u64_z = u32_x + u32_y;
Có thể tránh được hiện tượng tràn này nếu một trong các số nguyên 32 bit lần đầu tiên được ép hoặc thêm vào số nguyên 64 bit.
uint64_t u64_z = u32_x + u64_a + u32_y;
Tuy nhiên, nếu trình biên dịch quyết định sắp xếp lại thứ tự bổ sung:
uint64_t u64_z = u32_x + u32_y + u64_a;
sự tràn số nguyên vẫn có thể xảy ra.
Các trình biên dịch có được phép thực hiện việc sắp xếp lại như vậy hay chúng ta có thể tin tưởng họ nhận thấy sự không nhất quán của kết quả và giữ nguyên thứ tự biểu thức không?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
kết quả 0
, ngược lại (uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
kết quả là 0x100000000
và hai giá trị này không bằng nhau. Vì vậy, việc trình biên dịch có thể áp dụng phép biến đổi đó hay không là rất quan trọng. Nhưng đúng vậy, tiêu chuẩn chỉ sử dụng từ "tràn" cho các số nguyên có dấu, không có dấu.
uint32_t
các giá trị được thêm vào - những giá trị không bị tràn, chúng bao bọc. Đây không phải là những hành vi khác nhau.