Во-первых, смещение вправо отрицательного целого числа определяется реализацией. Следующая разыменование указателя типа, отличного от фактического типа, является явно неопределенным поведением из-за строгого правила псевдонимов (Google для него, если вы его не знаете).
Если вы хотите, чтобы ваш код был переносимым, единственный надежный способ - использовать memcpy для передачи представления значения. Это только предполагает, что:
sizeof(double)
совпадает с sizeof(uint64_t)
:
- знаковый бит - это бит63
uint64_t
с таким представлением
Код:
double d = -0.0;
uint64_t u;
memcpy(&u, &d, sizeof(u));
print("Sign bit in that architecture %d\n", u>>63);