Re: Integral conversions in C/C++

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Christian Böhme wrote:
> Andrew Haley wrote:
> 
>> Section 5 Para. 9
> 
> That's talking about _relational_ operators and starts with
> 
> "The usual arithmetic conversions are performed on operands of
>  arithmetic or enumeration type."

No, it isn't.  

ISO/IEC 14882:1998(E)
5 Expressions

9

Many binary operators that expect operands of arithmetic or
enumeration type cause conversions and yield result types in a similar
way. The purpose is to yield a common type, which is also the type of
the result. This pattern is called the usual arithmetic conversions,
which are defined as follows:

- If either operand is of type long double, the other shall be
  converted to long double.

- Otherwise, if either operand is double, the other shall be converted
  to double.

- Otherwise, if either operand is float, the other shall be converted to float. 

- Otherwise, the integral promotions (4.5) shall be performed on both
  operands.54)

- Then, if either operand is unsigned long the other shall be
  converted to unsigned long.

- Otherwise, if one operand is a long int and the other unsigned int,
  then if a long int can represent all the values of an unsigned int,
  the unsigned int shall be converted to a long int; otherwise both
  operands shall be converted to unsigned long int.

- Otherwise, if either operand is long, the other shall be converted
  to long.

- Otherwise, if either operand is unsigned, the other shall be
  converted to unsigned. [Note: otherwise, the only remaining case is
  that both operands are int ]

> going on about pointer conversions ectpp.  My example did,
> however, neither.  Any more pointers ?
> 
>> and Section 4.5.
> 
> That's "Integral promotions"

Well, yes.  That's what applies here.  The integral promotions
are relevant, because they are *directly* referred to in the
paragraph above.

> vs. 4.7 "Integral conversions" as in the subject of the OP.

Right, and you have now had the exact language quoted to you.

Your first example was

int64_t a;
uint32_t b = 8;

a = -(b * 2u);

So, the last section of Para 9 applies: b is promoted to unsigned
int, and the result, and unsigned int, is negated, yielding
another unsigned int.

In this case:

int64_t a;
uint32_t b = 8;

a = -((int64_t )(b * 2u));

the unsigned int result of (b * 2u) is converted to int64_t and
that is negated.

Andrew.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux