avr-gcc-list
[Top][All Lists]

## Re: [avr-gcc-list] Operation problem

 From: Dave Hansen Subject: Re: [avr-gcc-list] Operation problem Date: Sat, 11 Aug 2007 16:16:22 -0400

```From: "Gerard Marull Paretas" <address@hidden>
```
```> Paulo Marques:
```
> I think you just answered your own question: if all the variables involved
```are uint16_t, then that is the precision used for all he expression and it
will overflow on the multiplication.

The same happens whether if currentsong.length is uint32_t or uint16_t.
```
```
Yes.  The target of the assignment plays no part in the calculation.

Let's simplify some things.  Consider the the following code:

uint16_t w1=40000, w2=40000;
uint32_t dw1=40000, dw2=40000;
uint32_t r1, r2, r3, r4;

r1 = w1 + w2;
r2 = dw1 + dw2;
r3 = dw1 + w2;
r4 = (uint32_t)w1 + w2;

```
I haven't tried it, but I have a prediction: r1 will be 14464, but r2, r3, and r4 will all be 80000.
```
```
The reason is simple: the calculation in each statement is separate from the assignment. The calculation occurs first, and the result is then assigned to the target.
```
```
The first expression (w1+w2) is the addition of 2 uint16_t values, the result of which is a uint16_t. Since the addition overflows, only the lowest 16 bits are kept. That result is stored in r1.
```
```
The second expression is the addition of two uint32_t values. The result is a uint32_t, and no overflow occurs.
```
```
The third expression involves a uint32_t and a uint16_t. The promotion rules of C require the uint16_t value be promoted to uint32_t before the addition takes place. After that, it's just like the second expression.
```
```
The third expression has an explicit cast of a uint16_t (w1) to uint32_t. The conversion of w1 takes place before the addition, and the integer promotions then require that w2 be converted to uint32_t as well before the addition takes place. After that, it's just like the third expression.
```
```
If this is still fuzzy, try compiling the code above (or something like it), and look at the generated assembly.
```
Regards,

-=Dave

_________________________________________________________________
```
Find a local pizza place, movie theater, and more.then map the best route! http://maps.live.com/default.aspx?v=2&ss=yp.bars~yp.pizza~yp.movie%20theater&cp=42.358996~-71.056691&style=r&lvl=13&tilt=-90&dir=0&alt=-1000&scene=950607&encType=1&FORM=MGAC01
```

```