подскажите пожалуйста как можно содержимое переменной типа float (4 байта) переместить в переменную типа int (тоже четыре байта)
(уточнение: компилятор Microsoft Visual C++)
мне надо не привести значение к другому типу, а именно переместить кусок памяти переменной одного типа в переменную другого. ну и естественно необходима обратная операция для восстановления значения.
Здравствуйте, 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;
float fVal = 3.141592;
int nVal_way1 = *reinterpret_cast<int*>(&fVal);
// или
int nVal_way2 = (int&)(fVal);
Спасибо большое. По душе пришелся вариант с ссылками, однако должен заметить что вариант kubic2007 меня очень удивил своей оригинальностью, а товарищ 0x8000FFFF познакомил меня с новым оператором reinterpret_cast

Большое всем спасибо.
Здравствуйте, 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
Здравствуйте, 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);