2012-06-29 2 views
0

Я хотел бы знать, когда два целых числа умножаются, а результат - на короткий, короткий и назначается коротким, что будет решать компилятор? Ниже приведен фрагмент кодаВ GNU GCC 4.5.3 тип литья int для короткого

int a=1,b=2,c; 
short x=3,y=4,z; 

int p; 
short q; 

int main() 
{ 

c = a*b; /* Mul two ints and assign to int 
      [compiler resolves this to __mulsi3()] */ 

z = x*y; /* Mul two short and assign to short 
      [compiler resolves this to __mulhi3()] */ 

p = (x*y); /* Mul two short and assign to int 
       [compiler resolves this to __mulsi3()] */ 

q =(short)(a*b); /* Mul two ints typecast to short and assign to short 
        [compiler resolves this to __mulhi3()] */ 

return 0; 

} 

Здесь, в случае для q =(short)(a*b);, первые два Интс умножения должны быть выполнены (с использованием __mulsi3()), а затем назначить его коротким. Но здесь дело не в этом, и в компиляторе отбрасываются как a, так и b, а затем звонки __mulhi3().

Я хотел бы знать, как я могу изменить исходный код gcc [какой файл], чтобы я мог выполнить мои вышеуказанные требования.

+0

Почему вам все равно, какие инструкции он генерирует? Это приводит к неправильным результатам? –

ответ

0

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

В результате вам не нужно беспокоиться о том, какая функция умножения используется.

+0

Компилятор предназначен для конкретных целей и выполняется перенос. Следовательно, я требовал, чтобы указанные выше изменения были реализованы в исходном коде gcc. – user1235791

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