Странный вывод простого выражения в 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 в целочисленном делении.