Вступ
Проблема в цілому переповненні. Якщо він переповнюється, він повертається до мінімального значення і продовжує звідти. Якщо воно затоплюється, воно повертається до максимального значення і продовжується звідти. Зображення нижче має одометр. Я використовую це для пояснення переповнення. Це механічний перелив, але все ж хороший приклад.
В одометрі значення max digit = 9
, що виходить за межі максимального значення 9 + 1
, яке переносить і дає a 0
; Однак немає більшої цифри, яку можна було б змінити на a 1
, тому лічильник скидає zero
. Ви розумієте - "цілі числа переповнюються" спадають вам зараз на думку.
Найбільший десятковий буквальний тип int - 2147483647 (2 31 -1). Усі десяткові літерали від 0 до 2147483647 можуть з’являтися де завгодно, а інтралітерал може з’являтися, але буквальний 2147483648 може відображатися лише як операнд оператора одинарного заперечення -.
Якщо додавання цілого числа переповнюється, то результатом є біти низького порядку математичної суми, представлені у деяких досить великих форматах двох доповнення. Якщо відбувається переповнення, знаком результату є не те саме, що знаком математичної суми двох значень операнда.
Таким чином, 2147483647 + 1
переливається і обгортається до -2147483648
. Отже int i=2147483647 + 1
, буде переповнене, що не дорівнює 2147483648
. Крім того, ви кажете "завжди друкується 0". Це не так, тому що http://ideone.com/WHrQIW . Нижче ці 8 чисел показують точку, в якій воно крутиться і переповнює. Потім він починає друкувати 0. Крім того, не дивуйтеся, наскільки швидко це обчислюється, сьогоднішні машини швидкі.
268435456
536870912
1073741824
-2147483648
0
0
0
0
Чому переповнення цілого числа "обертається"
Оригінальний PDF