Tôi đã gặp mã từ một người dường như tin rằng có sự cố khi trừ một số nguyên không dấu khỏi một số nguyên khác cùng loại khi kết quả sẽ là số âm. Vì vậy, mã như thế này sẽ không chính xác ngay cả khi nó hoạt động trên hầu hết các kiến trúc.
unsigned int To, Tf;
To = getcounter();
while (1) {
Tf = getcounter();
if ((Tf-To) >= TIME_LIMIT) {
break;
}
}
Đây là trích dẫn mơ hồ có liên quan duy nhất từ tiêu chuẩn C mà tôi có thể tìm thấy.
Một phép tính liên quan đến các toán hạng không có dấu không bao giờ được vượt quá fl ow, bởi vì kết quả không thể được biểu diễn bằng kiểu số nguyên không dấu kết quả được giảm mô đun thành số lớn hơn một giá trị lớn nhất mà kiểu kết quả có thể biểu diễn.
Tôi cho rằng người ta có thể lấy câu trích dẫn đó có nghĩa là khi toán hạng bên phải lớn hơn, hoạt động được điều chỉnh để có ý nghĩa trong bối cảnh các số bị cắt ngắn theo mô-đun.
I E
0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF
trái ngược với việc sử dụng ngữ nghĩa đã ký phụ thuộc vào triển khai:
0x0000 - 0x0001 == (không dấu) (0 + -1) == (0xFFFF nhưng cũng 0xFFFE hoặc 0x8001)
Cách giải thích nào là đúng? Nó có được định nghĩa không?