Your problem is the wrong using of pointer arithmetics
+delta moves pointer not to delta bytes but to delta units, each unit size depends on the pointre type
So you can use high_bits = low_bits +1;
Or if you prefer your approach - cast &x to unsinged char before adding sizeof(int)