Giới thiệu
Vấn đề là tràn số nguyên. Nếu nó bị tràn, nó sẽ quay trở lại giá trị nhỏ nhất và tiếp tục từ đó. Nếu nó chảy dưới mức, nó sẽ quay trở lại giá trị lớn nhất và tiếp tục từ đó. Hình ảnh dưới đây là của một Odometer. Tôi sử dụng điều này để giải thích tràn. Đó là một sự tràn cơ học nhưng vẫn là một ví dụ điển hình.
Trong một Odometer, max digit = 9
vì vậy, vượt quá phương tiện tối đa 9 + 1
, mang lại và cho một 0
; Tuy nhiên, không có chữ số cao hơn để thay đổi thành a 1
, vì vậy bộ đếm đặt lại thành zero
. Bạn có ý tưởng - "tràn số nguyên" hiện ra trong đầu.
Chữ thập phân lớn nhất của kiểu int là 2147483647 (2 31 -1). Tất cả các ký tự thập phân từ 0 đến 2147483647 có thể xuất hiện ở bất kỳ nơi nào mà một ký tự int có thể xuất hiện, nhưng ký tự 2147483648 có thể chỉ xuất hiện dưới dạng toán hạng của toán tử phủ định một ngôi -.
Nếu một phép cộng số nguyên bị tràn, thì kết quả là các bit bậc thấp của tổng toán học như được biểu diễn trong một số định dạng phần bù đủ lớn của hai. Nếu xảy ra tràn, thì dấu của kết quả không giống như dấu của tổng toán học của hai giá trị toán hạng.
Do đó, 2147483647 + 1
tràn và bao quanh thành -2147483648
. Do đó int i=2147483647 + 1
sẽ bị tràn, không bằng 2147483648
. Ngoài ra, bạn nói "nó luôn in 0". Nó không, bởi vì http://ideone.com/WHrQIW . Dưới đây, 8 con số này hiển thị điểm mà nó xoay và tràn. Sau đó, nó bắt đầu in các số 0. Ngoài ra, đừng ngạc nhiên khi nó tính toán nhanh như thế nào, máy móc ngày nay rất nhanh.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Tại sao tràn số nguyên "quấn quanh"
PDF gốc