Двойное приведение значения в C для выполнения 64-битного умножения
Я пытаюсь реализовать IEEE 754 арифметику с плавающей запятой в программном обеспечении без использования FPU. Я много читал и нашел это решение для 64-битного умножения на этом сайте. Я понимаю большинство из них, но меня смущает, почему человек, который ответил на вопрос, использует значения 2 раза для одного и того же термина, и это не имеет смысла для меня. Я чувствую, что это имеет какое-то отношение к работе с старшими и младшими байтами решения, но я не вижу, как двойное приведение могло бы добиться этого. Вот код, о котором идет речь. Любая помощь, понимающая, почему это было сделано, была бы полезна.
uint64_t a_lo = (uint32_t)a;
uint64_t a_hi = a >> 32;
uint64_t b_lo = (uint32_t)b;
uint64_t b_hi = b >> 32;
uint64_t a_x_b_hi = a_hi * b_hi;
uint64_t a_x_b_mid = a_hi * b_lo;
uint64_t b_x_a_mid = b_hi * a_lo;
uint64_t a_x_b_lo = a_lo * b_lo;
uint64_t carry_bit = ((uint64_t)(uint32_t)a_x_b_mid +
(uint64_t)(uint32_t)b_x_a_mid +
(a_x_b_lo >> 32) ) >> 32;
uint64_t multhi = a_x_b_hi +
(a_x_b_mid >> 32) + (b_x_a_mid >> 32) +
carry_bit;
return multhi;