Приведение типов

Казалось бы, простая задача — прибавить к дате несколько дней. Дата хранится в структуре SYSTEMTIME, для выполнения арифметических операций её обычно преобразуют сначала в формат FILETIME (количество 100-наносекундных интервалов, прошедших с 1 января 1601 года), а затем в 64-битное целое (ведь FILETIME является структурой, и потому непосредственные арифметические операции над ней невозможны). Вот тут-то современные программисты в полной мере показывают, на что они способны!

const __int64 i100NanoSecInDay = (__int64) 10000000*60*60*24;
FILETIME ft;
__int64 time64;

// взяли адрес ft, преобразовали к указателю на тип __int64 и скопировали значение
time64 = *(__int64 *) &ft;
time64 += iDaysQty*i100NanoSecInDay; // прибавили нужное количество дней
*(__int64 *) &ft = time64; // обратная операция

Я конечно не сторонник максимальной экономии байтов и микросекунд, но ведь такой код и читается с трудом. Можно писать гораздо проще:

const __int64 i100NanoSecInDay = (__int64) 10000000*60*60*24;
union
{
	FILETIME ft;
	__int64 time64;
};

time64 += iDaysQty*i100NanoSecInDay; // прибавили нужное количество дней

Некоторые аккуратные программисты используют функцию memcpy, чтобы упростить текст, но от этого становится ещё более грустно...

На главную © Д.С. Кузьмин