При ориентации C99, я мог бы усечь и разделить значение double
на два 32-битовых целых чисел со следующим кодом:В C89, как я могу обрезать и разделить плавучую точку с двойной точностью на два 32-битных слова?
#include <stdint.h>
void split(double d, unsigned long *most_significant_word, unsigned long *least_significant_word)
{
uint64_t i = (uint64_t)d;
*most_significant_word = i >> 32;
*least_significant_word = i & 0xffffffff;
}
C89 однако, не кажется, чтобы определить 64-битное целое типа, так что я могу Не используйте компилятор для выполнения усечения. Даже если усечение не было необходимым (значение уже представляло целое число), я также не мог использовать операторы битов, такие как &
или >>
, поскольку они не работают с значениями double
.
Итак, как можно реализовать вышеприведенную функцию split()
в чистом C89 (и, таким образом, не полагаясь на 64-битные целые числа), возвращая 21/32-битные слова, которые составляют 53-битовое целое, сохраненное в значении double
?
C89 не предоставляет 'stdint.h'. Вы оставляете конкретные детали реализации. Поскольку он не обеспечивает 'long long', как вы читаете 64-битное значение? – Olaf
@ Olaf: однако C89 мандаты 'long' должны быть шириной не менее 32 бит. Использование 'unsigned long' должно быть прекрасным для выходов. –
@MatteoItalia: И как это противоречит моему комментарию? Я думаю, что я четко написал, что это ** конкретная реализация **, а не невозможная. Просто полагаться на 'long', чтобы иметь 32 бита, является очень неправильным. См. POSIX64! Однако большая проблема - это 64-разрядный тип. – Olaf