Странный вывод простого выражения в C, почему?

Я использую TurboC++. Я пишу следующее выражение, которое не приводит к правильной оценке, я пропускаю какое-то понятие позади этого?

int c=300*300/300;
printf("%d",c);

Выход

81

Зачем?

2 ответа

Решение
300*300 is 90000.

Предполагая, что int 16 бит, вы переполнились.

Переполнение распространяется вокруг, давая вам: 24464,

24465/300 = 81.55

Не надейтесь на это. Это неопределенное поведение.

Оценка 300 * 300 / 300 происходит слева направо.

300 * 300 переполняет 16-битный целочисленный тип со знаком int в Turbo C++ это 16 бит). Поскольку вычисления будут выполняться в знаковой арифметике, результат не определен.

То, что происходит, - это 300 * 300, и мы получаем 24464 (24464 + 32768 + 32768 = 90000).

24464/300 - 81 в целочисленном делении.

Другие вопросы по тегам