Почему это показывает неправильный ответ в C - PullRequest
0 голосов
/ 22 февраля 2019
long long int x;
 x=958657431*100;

для этого

я получаю ответ = 1376462588

почему это происходит, может кто-нибудь объяснить, тогда как я получаю правильный ответ, когда я делаю x = x * 100;в следующей строке

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Выражение 958657431*100 оценивается как int, а не как long long int.

Кажется, что на вашей платформе int не может содержать значение 95865743100.Следовательно, вы получаете что-то еще.

Используйте

x = 958657431LL * 100;

, чтобы получить умножение, которое будет сделано на long long int вместо int.

0 голосов
/ 22 февраля 2019

Ответ очевиден, если вы посмотрите на предупреждения вашего компилятора.

/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;

Примечание:

Переполнение знаковой переменной приводит к неопределенному поведению , что означает, что НИЧЕГО может произойти, включаяпрограмма работает как надо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...