GCC и TC дают разные результаты? - PullRequest
3 голосов
/ 18 августа 2011

Рассмотрим следующий код:

#include <stdio.h>

int main()
{
        printf("%d", 300 * 300 / 300);
        return 0;
}

Этот код при запуске на стандартном компиляторе GCC дает результат как 300, но когда я запускаю его с использованием Turbo C, результат равен 81.Почему это так?Я понимаю, что TC использует 2 байта для хранения целых чисел, и результат 300 * 300 явно превысит этот предел, но прежде чем он будет напечатан, он снова разделится на 300, верно?И что дополнительно вычисляется первым?300 / 300 или 300 * 300?) В чем причина такого поведения ??

Ответы [ 2 ]

6 голосов
/ 18 августа 2011

Перед печатью он делит его на 300, но переполнение уже произошло, поскольку целочисленные литералы оцениваются как int s, когда вы делите, вы уже с переполненным результатом int.

Поскольку * и / имеют одинаковый приоритет, * оценивается первым (, так как оценка слева направо )

Однако вы можете сделать либо 300 * (300/300), либо 300L * 300 / 300

2 голосов
/ 18 августа 2011

В Turbo C int имеет ширину 16 бит.300 * 300 = 90000 = 15F90h 15F90h будет усечено до 5F90h = 24464.Если вы разделите 24464 на 300, вы получите 81.

В GCC int обычно составляет 32 бита (не уверен насчет GCC в DOS и других экзотических / устаревших платформах).32 бита достаточно для хранения 90000.

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