'operator' : zero extending 'type' to 'type' of greater size
The result of the ~ operator is unsigned and then converted to a larger type.
In the following example, ~(a - 1) is evaluated as a 32-bit unsigned long expression and then converted to 64 bits by zero extension. This leads to pointer truncations.
void* p; unsigned long a; typedef unsigned __int64 ULONG_PTR; void main() { p = (void*)((ULONG_PTR)p & ~(a - 1)); }