Я хотел бы знать, когда два целых числа умножаются, а результат - на короткий, короткий и назначается коротким, что будет решать компилятор? Ниже приведен фрагмент кодаВ 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 [какой файл], чтобы я мог выполнить мои вышеуказанные требования.
Почему вам все равно, какие инструкции он генерирует? Это приводит к неправильным результатам? –