msb@lsuc.UUCP (Mark Brader) (03/10/85)
We run Edition VII on a 3220. This program: #include <stdio.h> main() { long l[5]; short s; l[0] = 0x234567; l[1] = s = l[0]; l[2] = s; l[3] = (short) l[0]; l[4] = (short) 0x234567; for (s = 0; s < 5; ++s) printf ("l[%d] = %x\n", s, l[s]); printf ("\n(short)0x234567 = %x\n", (short)0x234567); printf ("\nsizeof (short) = %d\nsizeof (long) = %d\n", sizeof (short), sizeof (long)); } should output 4567 for l[1] through l[4] and for the cast in the second-last printf. In fact, the result is: l[0] = 456789 l[1] = 456789 l[2] = 6789 l[3] = 456789 l[4] = 456789 (short)0x456789 = 456789 sizeof (short) = 2 sizeof (long) = 4 If char is substituted throughout for short, the casts work, but l[1] (long = char = long) is still wrong. The output then is: l[0] = 234567 l[1] = 234567 l[2] = 67 l[3] = 67 l[4] = 67 (char)0x234567 = 67 sizeof (char) = 1 sizeof (long) = 4 In case anyone doesn't believe that l[1] is wrong in both the above examples, they should consider this program: #include <stdio.h> main() { long l1, l2; float f; l1 = f = 123456789; l2 = f; printf ("%d\n%d\n", l1, l2); } This correctly produces: 123456784 123456784 Notice the loss of precision from the type conversions. Of course, an assignment is an expression whose type is that of the variable assigned to. I discovered the bug while debugging my signature line below. It doesn't work on this machine for type short! { allegra | decvax | duke | ihnp4 | linus | watmath | ... } !utzoo!lsuc!msb also via { hplabs | amd | ... } !pesnta!lsuc!msb Mark Brader and uw-beaver!utcsri!lsuc!msb #define msb(type) (~(((unsigned type)-1)>>1))
msb@lsuc.UUCP (Mark Brader) (03/10/85)
I said: > We run Edition VII on a 3220. > This program: > ...... > should output 4567 for l[1] through l[4] and for the cast in the second-last > printf. Of course I meant 6789, not 4567. Mark Brader