A value of the double
floating-point type is represented like so:
and it can be seen as two 32-bit integers; now, the int
taken in all the versions of your code (supposing it’s a 32-bit int
) is the one on the right in the figure, so what you are doing in the end is just taking the lowest 32 bits of mantissa.
Now, to the magic number; as you correctly stated, 6755399441055744 is 251?+?252; adding such a number forces the double
to go into the “sweet range” between 252 and 253, which, as explained by Wikipedia, has an interesting property:
Between 252?= 4,503,599,627,370,496 and 253?= 9,007,199,254,740,992, the representable numbers are exactly the integers.
This follows from the fact that the mantissa is 52 bits wide.
The other interesting fact about adding 251?+?252 is that it affects the mantissa only in the two highest bits—which are discarded anyway, since we are taking only its lowest 32?bits.
Last but not least: the sign.
IEEE?754 floating point uses a magnitude and sign representation, while integers on “normal” machines use 2’s?complement arithmetic; how is this handled here?
We talked only about positive integers; now suppose we are dealing with a negative number in the range representable by a 32-bit int
, so less (in absolute value) than (?231?+?1); call it??a. Such a number is obviously made positive by adding the magic number, and the resulting value is 252?+?251?+?(?a).
Now, what do we get if we interpret the mantissa in 2’s complement representation? It must be the result of 2’s complement sum of (252?+?251) and?(?a). Again, the first term affects only the upper two bits, what remains in the bits?0–50 is the 2’s?complement representation of?(?a) (again, minus the upper two bits).
Since reduction of a 2’s?complement number to a smaller width is done just by cutting away the extra bits on the left, taking the lower 32 bits gives us correctly?(?a) in 32-bit, 2’s?complement arithmetic.