Đó là vì 0x89678456543454345934
lớn hơn std::numeric_limits<unsigned_int>::max()
. Tuy nhiên, unsigned
loại bọc xung quanh giá trị tối đa của chúng, vì vậy nếu phía bên tay phải có thể biểu thị bằng loại số nguyên bạn có hành vi được xác định rõ. Trong trường hợp đó, kết quả là 0x89678456543454345934
mod std::numeric_limits<unsigned_int>::max
.
EDIT
Phía tay phải của nhiệm vụ của bạn là một integer literal. Để đại diện cho nó, trình biên dịch sử dụng kiểu đầu tiên (đặt hàng wrt kích thước của nó), trong đó các chữ số nguyên có thể phù hợp. Nếu không có loại như vậy, thì chương trình bị lỗi hình thức. Giá trị thập phân của hằng số của bạn là:
648873758694578209446196L
Trên máy tính của tôi, cho cả hai kêu vang ++ và g ++ std::numeric_limits<unsigned long long>::max()
là 18446744073709551615
, đó là nhỏ hơn so với thường xuyên của bạn. Dường như chương trình của bạn sau đó được hình thành không đúng, trừ khi trình biên dịch sử dụng nhiều hơn 64 bit để đại diện cho unsigned long long
, điều mà tôi rất nghi ngờ. Như @juanchopanza nhận xét, kêu vang ++ từ chối để biên dịch mã, với lỗi
error: integer constant is larger than the largest unsigned integer type
g ++ tuy nhiên đi trước và biên dịch nó, phát ra chỉ là một cảnh báo
warning: large integer implicitly truncated to unsigned type
Cảnh báo là khá khó hiểu, vì nó đề cập sang phía bên tay phải, không để việc chuyển đổi hơn nữa để unsigned int
, mà bạn nhận được
warning: large integer implicitly truncated to unsigned type [-Woverflow]
Trên máy tính của tôi std::numeric_limits<unsigned int>::max()
là 4294967295
và do đó 648873758694578209446196L % 4294967295
là 3633002191L
. Tuy nhiên khi tôi chạy chương trình của bạn, tôi nhận được 1412716852
. Điều này xảy ra vì chương trình không đúng định dạng, và tiếc là trình biên dịch không phát ra lỗi (nó không được bắt buộc theo tiêu chuẩn) mà chỉ là cảnh báo.
Do hoạt động của tràn số nguyên không dấu được xác định rõ. Hay bạn đang hỏi tại sao đó là, tại sao, tại sao các nhà thiết kế của C++ lại không mắc lỗi này? – juanchopanza
FWIW có thể bạn nên tăng mức độ cảnh báo của mình. –
có lý do tại sao là – wazeeer