Для вашего конкретного компилятора на вашем компьютере;вполне вероятно, что int a=2147483648;
по существу совпадает с int a=INT_MAX+1;
, который обрабатывается как int a=INT_MIN;
, и так же для int b
, и что это приводит к return INT_MIN+INT_MIN;
, что на самом деле похоже на "0x80000000 + 0x80000000 = 0x100000000 = 0x00000000 сoverflow ".
Однако все вышеперечисленное опирается на неопределенное поведение (при условии, что неопределенное поведение на практике случайно вызывает перенос).
В общем;Вы хотите использовать unsigned int
(или даже лучше, uint32_t
), чтобы избежать неопределенного поведения и получить «ожидаемое переполнение», на которое вы надеялись.