3 ms·
In my embedded development, I have trained myself to use unions instead of type-punned-pointer casts to access one data type as another. This document says thi
by markrages 12y ago
In my embedded development, I have trained myself to use unions instead of type-punned-pointer casts to access one data type as another.
This document says this is a GCC-specific extension. Is this true? Or is it one of those things that's not standardized, but the compiler vendors all do it anyway?
- cremno 12y agoIt's legal C99. See DR258 / C99+TC3. But be careful, reading trap representations is UB. http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_283.htm http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_283.htm http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
- effdee 12y agoType-punning via unions is allowed in both C99 [0] and C11. [0] see "ISO/IEC 9899:1999 Technical Corrigendum 3", http://www.open-std.org/Jtc1/sc22/wg14/www/docs/n1235.pdf http://www.open-std.org/Jtc1/sc22/wg14/www/docs/n1235.pdf
- oshepherd 12y agoType punning by pointer is explicitly UB per the standard. Type punning by union is implementation defined behavior. Everyone fortunately defines it to Do The Right Thing (TM). The truly standard supported way to type pun is by memcpy float f = ...; int x; memcpy(&x, &f, sizeof x);
- jakobegger 12y agoYes. Use memcpy if you need to do this! This is especially important when you're on a platform that requires aligned pointers. For example, the following code will crash on ARM char bytes[5] = {0}; float flt = *(float*)&(bytes[1]); Using memcpy works on any platform with 4 byte floats: char bytes[5] = {0}; float flt; memcpy(&flt, &(bytes[1]), 4);
- markrages 12y agoBut the union won't crash either (the compiler will keep it aligned), the conversion compiles to no-op, and doesn't waste memory. Embedded targets are always memory-constrained. If they aren't, you are wasting money on hardware.
- jakobegger 12y agoI was thinking about the case when you get unaligned data (eg you are reading from a file or from the network). Then you need to copy the data anyway.