Cast offsetof to ptrdiff_t before negating

The return value of offsetof is of the type size_t, which is unsigned.
When negating an unsigned value, the result still is unsigned.
Therefore, the current calculation might not be totally correct.

This gets rid of the warning "C4146: unary minus operator applied to
unsigned type, result still unsigned" in Visual C++. (Tested on
a version as old as Visual C++ 2008, to make sure the ptrdiff_t type
does exist there as well.)