При написании кода на С++ я внезапно осознал, что мои номера неправильно выбраны из double
в unsigned long long
.
Чтобы быть конкретным, я использую следующий код:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <limits>
using namespace std;
int main()
{
unsigned long long ull = numeric_limits<unsigned long long>::max();
double d = static_cast<double>(ull);
unsigned long long ull2 = static_cast<unsigned long long>(d);
cout << ull << endl << d << endl << ull2 << endl;
return 0;
}
Когда этот код выполняется на моем компьютере, у меня есть следующий вывод:
18446744073709551615
1.84467e+019
9223372036854775808
Press any key to continue . . .
Я ожидал, что первое и третье числа будут точно такими же (как и на Ideone), потому что я был уверен, что long double
взял 10 байт и сохранил мантиссу в 8 из них. Я бы понял, если третье число было усечено по сравнению с первым - просто для случая я ошибаюсь в формате чисел с плавающей запятой. Но здесь значения в два раза отличаются!
Итак, главный вопрос: почему? И как я могу предсказать такие ситуации?
Некоторые детали: я использую Visual Studio 2013 в Windows 7, компилирую для x86 и sizeof(long double) == 8
для своей системы.