Byteswapping floating point types
Ian Lance Taylor
iant@google.com
Wed Jul 15 00:35:00 GMT 2009
Andrew Troschinetz <ast@arlut.utexas.edu> writes:
> template<class T>
> T byteswap(T value)
> {
> T result;
> size_t n = sizeof (T);
> unsigned char* p = (unsigned char*) &value;
> for (size_t i = 0; i < n; ++i)
> ((unsigned char*) &result)[i] = p[n - 1 - i];
> return result;
> }
I would avoid aliasing issues and the problem you describe and write the
code like this (untested):
template<typename T>
T byteswap(T value)
{
char buf1[sizeof(T)], buf2[sizeof(T)];
memcpy(buf1, &value, sizeof(T));
for (size_t i = 0; i < sizeof(T); ++i)
buf2[i] = buf1[sizeof(T) - 1 - i];
T ret;
memcpy(&ret, buf2, sizeof(T));
return ret;
}
On some processors this can convert a valid floating point
representation into a trap representation which will cause a floating
point exception if the value is used. Presumably that is not an issue
for you.
Ian
More information about the Gcc-help
mailing list