little/big endian conversions

Regan Heath regan at netmail.co.nz
Tue Apr 8 03:59:42 PDT 2008


Bill Baxter wrote:
> Regan Heath wrote:
>> lurker wrote:
>>> does anybody know how to convert float and doubles to little/big endian?
>>
>> This is a guess but if you read:
>> http://en.wikipedia.org/wiki/IEEE_754
>>
>> You'll see the internal representation of a float, given that and a 
>> little guess work I've come up with:
>>
>> import std.stdio;
>>
>> int extractSign(float f)
>> {
>>     return (*(cast(int*)&f) & 0x80000000) ? -1 : 1;
>> }
>>
>> ubyte extractExp(float f)
>> {
>>     return (*(cast(int*)&f) << 1) & 0xFF000000;
>> }
>>
>> int extractFraction(float f)
>> {
>>     return *(cast(int*)&f) & 0x007FFFFF;
>> }
>>
>> void main()
>> {
>>     float f = -1.25f;
>>         auto   sign     = extractSign(f);
>>     auto   exp      = extractExp(f);
>>     auto   fraction = extractFraction(f);
>>         writefln(f);
>>     writefln(sign);
>>     writefln(exp);
>>     writefln(fraction);   }
>>
>> which will extract the various parts of a float.
>>
>> Now, I have no idea how they might change on a big/little endian 
>> system but I suspect each part would have it's byte order swapped.  In 
>> which case, byte order swapping the extracted parts then re-assembling 
>> might give you a byte order swapped float.
>>
>> Like I said, I'm guessing.
>>
>> What you want is 2 systems with different ordering and then you want 
>> to dump the content of the float like this:
>>
>> writefln("%032b", *(cast(int*)&f));
>>
>> then compare.
>>
>> Regan
> 
> 
> It doesn't matter that it's in IEEE 745 format.  You just swap the bytes 
> like it was any old kind of data.

Doh, for some reason I dismissed that as too simple.

Regan


More information about the Digitalmars-d-learn mailing list