Bug list for Microsoft C

Joseph Nathan Hall jnh at ece-csc.UUCP
Wed Jul 20 07:10:29 AEST 1988


In article <10807 at iuvax.cs.indiana.edu> bobmon at iuvax.UUCP (RAMontante) writes:
 seanf at sco.COM (Sean Fagan) writes:
 +iverson at cory.Berkeley.EDU.UUCP (Tim Iverson) writes:
 +>int i=1, j=33;
 +>
 +>main() {
 +>    printf("%x\n", 1<<33);
 +>    printf("%x\n", 1>>33);
 +>    printf("%x\n", i<<j);
 +>    printf("%x\n", i>>j);
 +>}
 +>What results do you get? (This might even be interesting on non 86 machines;
 +>oh boy, I just checked a non 86, and it failed too.)
 +
 +Under Xenix '386, I get: 2, 0, 2, 0; using the '286 compiler, I get 0, 0, 2,
 +0.  So, anybody, what does ANSI say (in plain English)?  I tried reading the
 +draft to see what it should be, and I couldn't make head nor tail of it...
 +Somebody said, earlier, that both K&R and ANSI say the results are
 +implementation defined, but, from what I could stand of the draft, it didn't
 +seem to say that.
 
 And Turbo C v1.5 gave me
 0
 0
 0
 0
 
 Something of a letdown, that.  So what ARE the right numbers, and what is the
 right answer?

First of all, you're not using a good example.  See page 45 of K&R.  The
right-shift operation on SIGNED quanties is undefined.  In the case of
UNSIGNED quantities, the right-shift operation is supposed to fill vacated
bits with zeros.

Second, something is broken if 1 << 33 returns something other than 2^33 or
0, since for unsigned AND signed quantities, bits vacated during a left-shift
operation are supposed to be filled with zero.

My preferred result would be four zeros.

Unless, of course, I had default 48- or 64-bit integers.

-- 
v   v sssss|| joseph hall                      || 201-1D Hampton Lee Court
 v v s   s || jnh at ece-csc.ncsu.edu (Internet)  || Cary, NC  27511
  v   sss  || the opinions expressed herein are not necessarily those of my
-----------|| employer, north carolina state university . . . . . . . . . . . 



More information about the Comp.lang.c mailing list