www.delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/1994/11/27/17:58:46

To: Kimberley Burchett <OKRA AT max DOT tiac DOT net>
Cc: DJGPP Mailing List <djgpp AT sun DOT soe DOT clarkson DOT edu>
Subject: Re: -1441992/4 = 1073381326
Date: Sun, 27 Nov 1994 16:01:09 EST
From: David Goldschmidt <gold AT ccr-p DOT ida DOT org>

>>>>> "Kimberley" == Kimberley Burchett <OKRA AT max DOT tiac DOT net> writes:

    Kimberley>   This program:
 
    Kimberley> int main() {
 
    Kimberley>   long x = -1441992; unsigned y = 4;
 
    Kimberley>   printf("%d / %d = %d\n",x,y,x/y); }
 
    Kimberley>   Spits this out:

    Kimberley> -1441992 / 4 = 1073381326


    Kimberley>   The division is done at compile time if I compile with
    Kimberley> optimizations on.  A more complex program where the division
    Kimberley> can't be done at compile time gets the same result doing the
    Kimberley> division at run time.  Can anyone tell me why?  As far as I
    Kimberley> know, even in the strange world of CPU math, overflows can't
    Kimberley> account for this result.  The only thing I can think of is that
    Kimberley> the compiler is using DIV instead of IDIV (however, in this
    Kimberley> case, dividing by 4, it shouldn't use any DIV).  The funny math
    Kimberley> only shows up when x is negative (never tried y negative...).
    Kimberley> It doesn't matter whether I'm using the C or the C++ compiler.

Your problem is that the negative long is being "promoted" to an unsigned
long because you called the divisor unsigned.  When you promote a negative
long to unsigned, you get a number between 2^31 and 2^32.  If you change
"unsigned" to "int" it works correctly.

David Goldschmidt

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019