Вот такой маленький примерчик (не из реальной жизни — на досуге игрался) для инвертирования 64-битного целого:
__int64 qqq(char *b)
{
__int64 i = 0;
unsigned char *p = (unsigned char *)&i;
#if 0 //1-й вариант
p[0] = b[7];
p[1] = b[6];
p[2] = b[5];
p[3] = b[4];
p[4] = b[3];
p[5] = b[2];
p[6] = b[1];
p[7] = b[0];
#else //2-й вариант
for (int j = 0, stop = sizeof(__int64); j < stop; ++j)
{
p[j] = b[stop - j - 1];
}
#endif
return i;
}
...
__int64 n = rand(), in;
in = qqq((char *)&n);
Что интересно — в обоих случаях генерируется абсолютно одинаковый ассемблер! И сама функция автоматически встраивается без указаний с моей стороны.
Приятно, блин. Ведь можно вообще написать что-нибудь типа:
template<class T>
T qqq(const char *b)
{
T i = 0;
char *p = (char *)&i;
for (int j = 0, stop = sizeof(T); j < stop; ++j)
{
p[j] = b[stop - j - 1];
}
return i;
}
P.S. К чему я всё это: просто в последнее время со всех сторон на меня сыпятся высказывания об "убогости" С++ компилляторов.