Учитывая следующий фрагмент:долго долго против ИНТ умножения
#include <stdio.h>
typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;
int main()
{
printf("%i\n", sizeof(int8));
printf("%i\n", sizeof(int32));
printf("%i\n", sizeof(int64));
int8 a = 100;
int8 b = 100;
int32 c = a * b;
printf("%i\n", c);
int32 d = 1000000000;
int32 e = 1000000000;
int64 f = d * e;
printf("%I64d\n", f);
}
Выход с MinGW GCC 3.4.5 является (-O0):
1
4
8
10000
-1486618624
Первое умножение отливают на int32 внутренне (в соответствии с выходом ассемблера). Второе умножение не выполняется. Я не уверен, отличаются ли результаты, потому что программа была запущена на IA32, или потому, что она определена где-то в стандарте C. Тем не менее мне интересно, если это точное поведение определено где-то (ISO/IEC 9899?), Потому что мне нравится лучше понимать, почему и когда я должен вручную накладывать (у меня проблемы с переносом программы из другой архитектуры).
Очень хорошо поставил. @azraiyl должен изменить эту строку на 'int64 f = (int64) d * e;' –
Извините, что я не сказал, что знаю это решение здесь. Меня интересует, почему умножение int32 * int32 в первом случае, а не int8 * int8. Даже если процессор поддерживает только умножение int32, он может быть возвращен в int8 после умножения. Но инструкция IA32 imul работает для 8-битных регистров (AL, ...). – azraiyl
@azrayl: По крайней мере, на C90, C продвигал все арифметические операнды до 'int', если они были меньшего размера. Взгляд на стандарт C99 предполагает, что это уже не так, но я не уверен. Какой компилятор C вы используете, и, если применимо, с какими параметрами? –