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

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

FILETIME ft;
__int64 time64;

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

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

union
{
	FILETIME ft;
	__int64 time64;
};

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

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

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