Ответ очевиден, если вы посмотрите на предупреждения вашего компилятора.
/tmp$ gcc main.c
main.c: In function ‘main’:
main.c:4:16: warning: integer overflow in expression of type ‘int’ results in ‘1376462588’ [-Woverflow]
x=958657431*100;
^
Когда вы выполняете задание в форме x = expr
, оценка expr
совершенно не знает о типеx
.Умножение на два int
всегда даст результат с типом int
, даже если он переполнится.
Одним из решений является добавление суффикса типа, подобного этому:
x = 958657431LL * 100;
или используйте приведение
x = (long long)958657431 * 100;
Примечание:
Переполнение знаковой переменной приводит к неопределенному поведению , что означает, что НИЧЕГО может произойти, включаяпрограмма работает как надо.