Some C89 compilers with 32-bit longs won't automatically widen integer
constants to (unsigned) long long in order to represent values that
don't fit in an (unsigned) long, even if those compilers otherwise
support 64-bit long long.
The "ll" and "ull" suffixes seem to get things working.
# include "test.h"
#endif
-#define B64(x) ((x) & 0xffffffffffffffff)
+#define B64(x) ((x) & 0xffffffffffffffffull)
struct test_rng {
unsigned long long state[4];
{
unsigned long long z;
- z = B64(*state += 0x9e3779b97f4a7c15);
- z = B64((z ^ (z >> 30)) * 0xbf58476d1ce4e5b9);
- z = B64((z ^ (z >> 27)) * 0x94d049bb133111eb);
+ z = B64(*state += 0x9e3779b97f4a7c15ull);
+ z = B64((z ^ (z >> 30)) * 0xbf58476d1ce4e5b9ull);
+ z = B64((z ^ (z >> 27)) * 0x94d049bb133111ebull);
return z ^ (z >> 31);
}