On Thu, Apr 22, 2010 at 03:49:11PM -0700, Bakul Shah wrote:
> On Thu, 22 Apr 2010 23:15:51 +0200 tlaro...@polynum.com  wrote:
> > This is: signed long + signed long + unsigned char.
> 
> > Do you mean that there is first promotion :
> > 
> >     1) unsigned char is promoted to unsigned int (A6.1).
> 
> As per C89 in this case the unsigned char value should be
> promoted to a *signed* int value.  The sum will be of type
> signed int and so the division will do the right thing. In
> kencc case it seems the sum has type unsigned int for some
> reason and further, the signed divisor (2) is promoted to an
> unsigned int. Seems like a bug.
> 
> Now that you know the problem, you can work around it by
> setting type smallnumber to a signed char (since its range is
> 0..64 this should just work with either compiler).
> 
> > And when I do first assignment, there is only promotion (since no
> > operator is here).
> 
> There is promotion since you did += but it doesn't matter.
> In C, a variable has a static type and you can't override
> this type by any assignment.
> 
> > Yielding the correct value in x2, that is then
> > divided (or shifted) by 2, hence signed, and no problem?
> 
> Yes.

OK, thanks for the clarifications---more conform to what I
expected/the way I interpreted the norm---.

You gave a very simple test case for verifying a fix.

Cheers,
-- 
        Thierry Laronde <tlaronde +AT+ polynum +dot+ com>
                      http://www.kergis.com/
Key fingerprint = 0FF7 E906 FBAF FE95 FD89  250D 52B1 AE95 6006 F40C

Reply via email to