Урок 18. Паттерн 10. Хранение в double целочисленных значений
Тип double имеет размер 64 бита, и совместим со стандартом IEEE-754 на 32-битных и 64-битных системах.
Примечание. IEEE 754 — широко распространённый стандарт формата представления числа с плавающей запятой, используемый как в программных реализациях арифметических действий, так и во многих аппаратных (CPU и FPU) реализациях. Многие компиляторы языков программирования используют этот стандарт для хранения и выполнения математических операций.
Некоторые программисты используют тип double для хранения и работы с целочисленными типами:
size_t a = size_t(-1);
double b = a;
--a;
--b;
size_t c = b; // x86: a == c
// x64: a != c
Данный пример еще можно пытаться оправдать на 32-битной системе, так как тип double имеет 52 значащих бита и способен без потерь хранить 32-битное целое значение. Но при попытке сохранить в double 64-битное целое число точное значение может быть потеряно (см. рисунок 1).
Рисунок 1 - Количество значащих битов в типах size_t и double
Возможно, приближенное значение вполне применимо в Вашей программе, но на всякий случай хочется сделать предупреждение о потенциальных эффектах на новой архитектуре. И в любом случае не рекомендуется смешивать целочисленную арифметику и арифметику с плавающей точкой.
Диагностика
Данный паттерн ошибок относится к редко встречающимся на практике. Тем не менее, редко встречающиеся ошибки не менее опасны. Анализатор PVS-Studio предупреждает о потенциально возможной ошибке с помощью диагностического сообщения V113. Если необходимо обнаружить явное приведение типов (от memsize к double и обратно), то можно включить предупреждение V203.
Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++" является ООО "Системы программной верификации". Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com.