Проблема в порядке байтов (то есть в порядке байтов).Возможно, вы не сможете просто использовать memcpy (), в зависимости от порядкового номера вашей системы.В любом случае, если вы имеете дело с отдельными байтами, вам нужно будет учитывать порядок байтов ... то, что будет работать в одной системе, не обязательно будет работать в другой.
Попробуйте эту программу:
#include <stdio.h>
//typedef __int64 int64; // for Visual Studio
//typedef unsigned __int64 uint64; // for Visual Studio
typedef long long int64; // for GCC
typedef unsigned long long uint64; // for GCC
//#define PRId64 "%I64d" // for Visual Studio
//#define PRIu64 "%I64u" // for Visual Studio
#define PRIu64 "%llu" // for GCC
#define PRId64 "%lld" // for GCC
union U {
unsigned char c[8];
int64 s64;
uint64 u64;
double d;
};
void printU( U& u )
{
printf("Raw bytes: %02x %02x %02x %02x %02x %02x %02x %02x "
" (%u %u %u %u %u %u %u %u)\n"
"Interpreted as a signed 64-bit integer: "PRId64"\n"
"Interpreted as an unsigned 64-bit integer: "PRIu64"\n"
"Interpreted as a double (with 'float' precision): %f\n\n",
u.c[0], u.c[1], u.c[2], u.c[3],
u.c[4], u.c[5], u.c[6], u.c[7],
u.c[0], u.c[1], u.c[2], u.c[3],
u.c[4], u.c[5], u.c[6], u.c[7],
u.s64, u.u64, (float)u.d);
}
int main()
{
U u;
u.c[0]=63; u.c[1]=240; u.c[2]=0; u.c[3]=0;
u.c[4]=0; u.c[5]=0; u.c[6]=0; u.c[7]=0;
printU(u);
u.c[0]=0; u.c[1]=0; u.c[2]=0; u.c[3]=0;
u.c[4]=0; u.c[5]=0; u.c[6]=240; u.c[7]=63;
printU(u);
}
В моей системе x86 Linux с GCC я получаю следующие результаты:
Raw bytes: 3f f0 00 00 00 00 00 00 (63 240 0 0 0 0 0 0)
Interpreted as a signed 64-bit integer: 61503
Interpreted as an unsigned 64-bit integer: 61503
Interpreted as a double (with 'float' precision): 0.000000
Raw bytes: 00 00 00 00 00 00 f0 3f (0 0 0 0 0 0 240 63)
Interpreted as a signed 64-bit integer: 4607182418800017408
Interpreted as an unsigned 64-bit integer: 4607182418800017408
Interpreted as a double (with 'float' precision): 1.000000
Я подозреваю, что кто-то, работающий с Visual Studio (на x86, конечно), получит те же результаты.Когда я запускаю ту же программу на компьютере с PowerPC Linux (также GCC), я получаю следующие результаты:
Raw bytes: 3f f0 00 00 00 00 00 00 (63 240 0 0 0 0 0 0)
Interpreted as a signed 64-bit integer: 4607182418800017408
Interpreted as an unsigned 64-bit integer: 4607182418800017408
Interpreted as a double (with 'float' precision): 1.000000
Raw bytes: 00 00 00 00 00 00 f0 3f (0 0 0 0 0 0 240 63)
Interpreted as a signed 64-bit integer: 61503
Interpreted as an unsigned 64-bit integer: 61503
Interpreted as a double (with 'float' precision): 0.000000
Я предполагаю, что вы можете преобразовать это исследование в соответствующий код преобразования для вашей платформы,Если мое предположение неверно, дайте мне знать, и я напишу необходимый вам двухстрочный код после того, как вы запустите вышеупомянутую программу в своей системе и опубликуете результаты.