2014-02-11 2 views
-1

Я использую std::hash<std::string>() для создания хеш-кода для строки на C++. Функция возвращает long double, но мне нужно uint64_t по унаследованным причинам.Безопасный лить long double to uint64_t

Является ли такой литой сейф?

+0

Как это будет? 'long double' - это плавающая запятая,' uint64_t' - целое число. –

+1

Я думаю, вы должны STATIC_ASSERT sizeof (uint64_t) == sizeof (long double) –

+1

Какой тип? – sgarizvi

ответ

1

C++ Стандартный пункт 3.9.1.8 говорит:

Есть три типа с плавающей точкой: поплавок, двойной и длинный двойной. Тип double обеспечивает как минимум такую ​​же точность, как float, а double double double обеспечивает как минимум такую ​​же точность, как double. Набор значений типа float является подмножеством набора значений типа double; набор значений типа double является подмножеством набора значений типа long double. Представление значений типов с плавающей запятой определяется реализацией. Интегральные и плавающие типы совместно называются арифметическими типами. Специализации стандартного шаблона std :: numeric_limits (18.3) должны указывать максимальное и минимальное значения каждого арифметического типа для реализации.

Которая в значительной степени только говорит о том, что длинный двойной тип должен быть ... длиннее поплавкового типа.

На практике длинные дважды, как правило, 80- до 128-битную, как описано здесь: http://en.cppreference.com/w/cpp/language/types
Это делает кастинг (я предполагаю reinterpret_cast) к uint64_t небезопасным, так как некоторые биты от длинного двойного, вероятно, не поместиться.

3

Оператор вызова std::hash возвращает значение типа size_t, которое представляет хеш-значение параметра.

Таким образом, предположение о том, что вопрос о возврате long double, кажется неправильным.

+0

Ух, ты, конечно, прав. Это то, что я получаю от доверия к шаткой IDE, а не за чтением документов. – span

Смежные вопросы