Puzzle on unsigned promotions
Chris Torek
chris at mimsy.UUCP
Fri Jul 1 06:02:08 AEST 1988
In article <736 at vsi.UUCP> friedl at vsi.UUCP (Stephen J. Friedl) writes:
>... unsigned- vs value-perserving rules ...
[and the following code, reproduced without > to fool inews; slightly
compressed]
main()
{
unsigned short sval;
long lval1, lval2;
sval = 0xffff;
lval1 = -sval;
lval2 = -(unsigned short)0xffff;
printf("lval #1 = %ld #2 = %ld\n", lval1, lval2);
}
Well, first, no matter what, you should get the same value in lval1
and lval2. A cast is equivalent to assignment to an unnamed temporary,
so the second assignment is like writing
{ unsigned short tmp; tmp = 0xffff; lval2 = -tmp; }
which is semantically identical to `lval1 = -sval'.
Now, to answer `what should I get', you need to know the relative
sizes of short, int, and long (and their unsigned variants).
sval = 0xffff; sizeof(short) = 2; sizeof(int) = sizeof(long) = 4:
lval = -sval:
Old rule: unsigned stays unsigned
First turn sval into an rvalue: (u_short)0xffff is
extended to (u_int), result is (u_int)0x0000ffff
Next negate: result is (u_int)0xffff0001
Next convert to (signed long) by `bits-as-is' due
to assignment: (long)0xffff0001 or -65535.
New rule: unsigned stays unsigned if the new type does not
have more bits, otherwise unsigned becomes signed:
First turn sval into an rvalue: (u_short)0xffff is
extended to (signed int), result is (int)0x0000ffff.
[note that the bit pattern produced by both rules is always identical;
the difference is in the interpretation of that bit pattern---signed vs
unsigned]
Next negate: result is (int)0xffff0001
Convert to long by `bits-as-is': (long)0xffff0001 or
-65535.
>The normal answer I get is:
>
> lval #1 = -65535 #2 = -65535
which is correct.
>but on the HP9000 I see:
>
> lval #1 = 1 #2 = -65535
Your HP9000 compiler is broken.
>Please email, I'll summarize and post.
Oops :-)
--
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163)
Domain: chris at mimsy.umd.edu Path: uunet!mimsy!chris
More information about the Comp.lang.c
mailing list