2010-09-21 3 views
2

В приведенном ниже коде значение prod не равно 9 000 000; он получает значение для мусора. Почему нам нужно, чтобы num1 и num2 имели тип long?Переполнение с продуктом ints

#include <stdio.h> 
int main() 
{ 
    int num1 = 3000, num2 = 3000; 
    long int prod = num1 * num2; 
    printf("%ld\n", prod); 
    return 0; 
} 
+0

Попробуйте выполнить их заготовку задолго до умножения. –

+1

Это для меня 900000. Вы проверяете в отладчике или выходе? – linuxuser27

+5

@linuxuser: Хотите сделать ставку на то, что ваш 'int' шире его? –

ответ

9

Когда num1 * num2 вычисляется, она хранится в промежуточной переменной, того же типа (то есть, целое число), который придумывает как мусор, потому что это не достаточно большой. Затем промежуточная переменная хранится в длинном int, но вычисляемый ответ уже был превращен в мусор.

Решение состоит в том, чтобы сделать один из аргументов умножения.

long int prod = (long int)num1 * num2; 

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

+2

Примечание: переполнение (и недополнение) с целями ints ** Undefined Behavior **. Избегайте любой ценой: используйте 'unsigned ints' (нет UB, но возможны неправильные результаты) или проверьте переполнение ** до того, как это произойдет **. – pmg

+0

@pmg: Незнакомый int удвоит диапазон над подписанным, но это не всегда предотвратит переполнение. Переполняет unsigned int "defined"? –

+4

@Steven: при переполнении 'unsigned ints' они не вызывают UB; они обертываются до 0 (они управляют «MOD (UINT_MAX + 1)»). – pmg

Смежные вопросы