This is in C, but I tagged it C++ incase it’s the same. This is being built with:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.220 for 80×86
if that makes any different
Why does this work?
(inVal is 0x80)
float flt = (float) inVal;
outVal = *((unsigned long*)&flt);
(results in outVal being 0x43000000 — correct)
But this doesn’t?
outVal = *((unsigned long*)&((float)inVal));
(results in outVal being 0x00000080 — NOT CORRECT 🙁 )
Before asking this question I googled around a bit and found this function in java that basically does what I want. If you’re a bit confused about what I’m trying to do, this program might help explain it:
class hello
{
public static void main(String[] args)
{
int inside = Float.floatToIntBits(128.0f);
System.out.printf("0x%08X", inside);
}
}
You’re trying to take the address of a non-const temporary (the result of your
(float)conversion) – this is illegal in C++ (and probably also in C). Hence, your code results in garbage.In your first, working, code, you’re not using a temporary so your code is working. Notice that from a standards point of view this is still ill-defined since the size and internal representation of the involved types isn’t specified and may differ depending on platform and compiler. You’re probably safe, though.