That makes sense.
Because it's using unsigned integers, and hence unsigned division, negative values aren't divided correctly (except by 1 obviously).
Code: Select all
#define ptrdiff(t, a, b) (cptr(t ptr, a) - cptr(t ptr, b))
#define ptrdiffs(t, a, b) ((cint(a) - cint(b)) \ sizeof(t))
#define ptrdiffu(t, a, b) ((cuint(a) - cuint(b)) \ sizeof(t))
Dim As Double a(0 to 1)
print "signed"
print ptrdiffs(double, @a(1), @a(0)), ptrdiffs(double, @a(0), @a(1))
print ptrdiffs(integer, @a(1), @a(0)), ptrdiffs(integer, @a(0), @a(1))
print ptrdiffs(byte, @a(1), @a(0)), ptrdiffs(byte, @a(0), @a(1))
print
print "unsigned"
print ptrdiffu(double, @a(1), @a(0)), ptrdiffu(double, @a(0), @a(1))
print ptrdiffu(integer, @a(1), @a(0)), ptrdiffu(integer, @a(0), @a(1))
print ptrdiffu(byte, @a(1), @a(0)), ptrdiffu(byte, @a(0), @a(1))
print
print "FB"
print ptrdiff(double, @a(1), @a(0)), ptrdiff(double, @a(0), @a(1))
print ptrdiff(integer, @a(1), @a(0)), ptrdiff(integer, @a(0), @a(1))
print ptrdiff(byte, @a(1), @a(0)), ptrdiff(byte, @a(0), @a(1))
print
Code: Select all
signed
0 0
0 0
1 -1
unsigned
0 536870911
0 1073741823
1 4294967295
FB
0 536870911
0 1073741823
1 4294967295
The high values are because the sign bit is treated as 2^31 instead of -2^31.
So the fix looks like it would be simply to change the result of the subtraction from unsigned to signed, which thankfully concurs with what Gonzo says.