Strange that D is printing large values as zero. Any mistake in my code?

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Thu Feb 14 08:03:39 PST 2013


On 02/14/2013 04:49 PM, Adam D. Ruppe wrote:
>> const long DIM = 1024*1024*1024*1024*4;
>
> Those are all int (32 bit) literals so it is prolly wrapping around the
> intermediates before it actually assigns to DIM.
>
> If you used 1024L it should be better, by making the right hand side 64 bit too.

Oh, snap. :-P

First time I ran into this kind of issue was when I was calculating a power of 2 
in C++ by using:

     size_t p = 1 << m;

m was calculated to ensure that 2 ^^ m was the largest power of 2 that could (i) 
be multiplied by 2 without integer wraparound and (ii) fell within the range of 
the uniform random number generator.  And all was fine until I upgraded my 
system to 64-bit, and suddenly I was getting a nonsense value of p.

It shouldn't have changed, because the RNG used a 32-bit unsigned integer as its 
internal data type.  After much head-scratching I cottoned on to the fact that 
as it was, 1 << m was a regular integer that was wrapping around to a negative 
value before being converted to size_t (which in practice meant: it came out as 
the maximum of size_t less the negative value).  With 32-bit size_t this was the 
correct value.  With 64-bit size_t it meant a value of p far larger than it 
should have been.

Replace the power-of-2 statement with

     size_t p = 1UL << m;

... and everything was cured.


More information about the Digitalmars-d-learn mailing list