Ссылаясь на http://en.cppreference.com/w/c/language/conversion как было упомянуто Joachim,
Сначала умножение двух целых чисел происходит. Затем результат сохраняется в поплавке.
Итак, мы смотрим на iVal * ulVal
. Здесь мы ссылаемся на раздел на Обычные арифметические преобразования. Оба операнда являются целыми числами, поэтому применяется случай 4..
Сначала целые рекламные акции. В этом оба операнда являются ints или больше, поэтому они не изменяются.
Если типы после продвижения те же, что тип является распространенным типом
Это не применимо, так как типы INT и без знака длиной соответственно.
В противном случае, если оба операнда после продвижения имеет одинаковую знаковость (подписанный или оба знака), операнд с меньшим рангом преобразования (см ниже) неявно преобразуется к типу операнда с большим рангом преобразования
Это тоже не применяется, так как подписан один тип, а второй является беззнаковое
в противном случае, знаковость отличается: Если операнд с неподписанных типа имеет преобразование ранг больше или равен ранг типа подписанный операнд, то операнд с знаковым типом неявно преобразуется в беззнаковый тип
Здесь без знака операнд длинный и подписанный является ИНТОМ ранга долго больше междунара, поэтому применяется эта часть. Подписанный int преобразуется в unsigned long.
Итак, у нас есть умножение двух чисел 4294967289
(без знака длиной) и 1000
(без знака длинный). При выполнении умножения происходит переполнение, но если вы вычислите 4294967289000 % 2^32
, вы получите 4294960296
.
Затем оно преобразуется в поплавок на знак равенства и затем печатается.
[Эта скрытая ссылка на конверсии] (http://en.cppreference.com/w/c/language/conversion) может пригодиться. –