Как выполнить замену байтов двойным?

Я пытаюсь написать процедуру обмена байтами для программы на C ++, работающей в Win XP. Я компилирую с Visual Studio 2008. Вот что я придумал:

int byteswap(int v) // This is good
{
    return _byteswap_ulong(v);
}

double byteswap(double v) // This doesn't work for some values
{
    union { // This trick is first used in Quake2 source I believe :D
        __int64 i;
        double  d;
    } conv;
    conv.d = v;
    conv.i = _byteswap_uint64(conv.i);
    return conv.d;
}

И функцию для тестирования:

void testit() {
    double  a, b, c;
    CString str;

    for (a = -100; a < 100; a += 0.01) {
        b = byteswap(a);
        c = byteswap(b);
        if (a != c) {
            str.Format("%15.15f %15.15f %15.15f", a, c, a - c);
        }
    }
}

Получение этих чисел, не совпадающих:

-76.789999999988126 -76.790000000017230 0.000000000029104  
-30.499999999987718 -30.499999999994994 0.000000000007276  
 41.790000000014508  41.790000000029060 -0.000000000014552  
 90.330000000023560  90.330000000052664 -0.000000000029104

Это после прочтения:
Как мне преобразовать между прямым порядком и обратным порядком байтов в C ++?
Little Endian - Big Endian Problem
Между прочим, вы не можете использовать > в double (если я не ошибаюсь ?)

6
задан Community 23 May 2017 в 10:29
поделиться