FloatBitsToInt и обратно
От: Grief Россия Grief-postal.narod.ru
Дата: 09.06.07 20:10
Оценка:
подскажите пожалуйста как можно содержимое переменной типа float (4 байта) переместить в переменную типа int (тоже четыре байта)
(уточнение: компилятор Microsoft Visual C++)
мне надо не привести значение к другому типу, а именно переместить кусок памяти переменной одного типа в переменную другого. ну и естественно необходима обратная операция для восстановления значения.
Re: FloatBitsToInt и обратно
От: Аноним  
Дата: 09.06.07 20:26
Оценка:
i=(int&)f;(int&)f=i;
Re: FloatBitsToInt и обратно
От: kubic2007  
Дата: 09.06.07 21:15
Оценка:
Здравствуйте, Grief, Вы писали:

G>подскажите пожалуйста как можно содержимое переменной типа float (4 байта) переместить в переменную типа int (тоже четыре байта)

G>(уточнение: компилятор Microsoft Visual C++)
G>мне надо не привести значение к другому типу, а именно переместить кусок памяти переменной одного типа в переменную другого. ну и естественно необходима обратная операция для восстановления значения.

Примерно так:

    //Объявление
    union float_int {
        float fFloat;
        int   nInt;
    };
    struct ConstTemp {
    union float_int ConstTConv;
    };

    struct ConstTemp CnstT;
...
    //Использование

    //float -> int
    CnstT.ConstTConv.fFloat = 1.2f;
    int nInt = CnstT.ConstTConv.nInt;

    //int -> float
    CnstT.ConstTConv.nInt = 0x40234567;
    float fFloat = CnstT.ConstTConv.fFloat;
Re: FloatBitsToInt и обратно
От: 0x8000FFFF Россия  
Дата: 10.06.07 05:48
Оценка:
float fVal = 3.141592;
int nVal_way1 = *reinterpret_cast<int*>(&fVal);
// или 
int nVal_way2 = (int&)(fVal);
Re[2]: FloatBitsToInt и обратно
От: Grief Россия Grief-postal.narod.ru
Дата: 10.06.07 06:46
Оценка:
Спасибо большое. По душе пришелся вариант с ссылками, однако должен заметить что вариант kubic2007 меня очень удивил своей оригинальностью, а товарищ 0x8000FFFF познакомил меня с новым оператором reinterpret_cast Большое всем спасибо.
Re[3]: FloatBitsToInt и обратно
От: Bell Россия  
Дата: 10.06.07 09:36
Оценка:
Здравствуйте, Grief, Вы писали:

G>Спасибо большое. По душе пришелся вариант с ссылками, однако должен заметить что вариант kubic2007 меня очень удивил своей оригинальностью, а товарищ 0x8000FFFF познакомил меня с новым оператором reinterpret_cast Большое всем спасибо.


Вариант от kubic2007 формально некорректен, т.к. стандарт запрещает смешанную запись/чтение элементов объединения — т.е. нельзя записать значение в fFloat и затем считать nInt. Хотя справедливости ради нужно отметить, что часто подобное использование объединений дает ожидаемые результаты.

Теперь насчет варианта со ссылками: копирования значений там не происходит, а это, насколько я понял из условия, не то, что тебе нужно. Так что вариант с reinterpret_cast ИМХО как раз то, что тебе нужно.

Ну и напоследок еще один вариант:
float fVal = 3.141592;
int nVal;

memcpy(&nVal, &fVal, sizeof(nVal));//float -> int
memcpy(&fVal, &nVal, sizeof(nVal));//int -> float
Любите книгу — источник знаний (с) М.Горький
Re[2]: FloatBitsToInt и обратно
От: Roman Odaisky Украина  
Дата: 11.06.07 06:15
Оценка:
Здравствуйте, 0x8000FFFF, Вы писали:

FFF>
FFF>float fVal = 3.141592;
FFF>int nVal_way1 = *reinterpret_cast<int*>(&fVal);
FFF>// или 
FFF>int nVal_way2 = (int&)(fVal);
FFF>


Тогда уже так:
int i = reinterpret_cast<int const &>(f);
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.