This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

need help for arithmetic conversion about gcc


Dear all,

I am trying to figure out the rules of arithmetic conversion in gcc.
In my previous understanding, suppose there are two operands with the
different data type, the operand with less integer conversion rank
would be converted to the type of the operand with greater rank. But I
found it does not work like that in gcc. Take the following statements
as an example,

short ilval irval;
long lval;
ilval = lval + irval;

In this case, both lval and ilval are converted to "short unsigned
int", the result of "(short unsigned int) lval+(short unsigned int)
irval" is then converted to "short int". I found the coversion notes
from the RTL codes' file. The corresponding informations is given
below:

;; D.1528 = (short unsigned int) lval
;; irval.0 = (short unsigned int) irval
;; D.1530 = D.1528 + irval.0
;; ilval = (short int) D.1530

The part which confuses me is that the operand "lval" is converted
from a type with greater rank (i.e., long ) to a type with less rank
(i.e., short unsigned int ).

However if it is multiply operation case, like this:

short ilval irval;
long lval;
ilval = lval + irval;

gcc handles it another way:

;; D.1528 = (long int) irval
;; D.1529 = D.1528 * lval
;; ilval = (short int) D.1529

In this case (multiply operation), irval is converted from a type with
less rank (int) to the type with greater rank (long).


I wonder why these two cases are treated differently.
Can anyone help me?
I would be more than happy if you can also give some materials
regarding the arithmetic conversion rules of gcc.

Thank you very much.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]