Code can be used to test a machine, and also includes big-endian/little-endian converters (for float and double), which can be modified and included into C++.
Just copy the code into a file, for example “endiantest.c,” then compile it using “gcc endiantest.c,” and execute “a.out.”
Good luck!
Hao
#include <stdio.h>
float floatSWAP(float f)
{
union
{
float f;
unsigned char b[4];
} dat1, dat2;
dat1.f = f;
dat2.b[0] = dat1.b[3];
dat2.b[1] = dat1.b[2];
dat2.b[2] = dat1.b[1];
dat2.b[3] = dat1.b[0];
return dat2.f;
}
double doubleSWAP(double df)
{
union
{
double df;
unsigned char b[8];
} dat1, dat2;
dat1.df = df;
dat2.b[0] = dat1.b[7];
dat2.b[1] = dat1.b[6];
dat2.b[2] = dat1.b[5];
dat2.b[3] = dat1.b[4];
dat2.b[4] = dat1.b[3];
dat2.b[5] = dat1.b[2];
dat2.b[6] = dat1.b[1];
dat2.b[7] = dat1.b[0];
return dat2.df;
}
int IsBigEndian()
{
short int word = 0x0001;
char *byte = (char *) &word;
return (byte[0] ? 0:1);
}
float BEfloat(float f)
{
if (IsBigEndian())
return f;
else
return floatSWAP(f);
}
float LEfloat(float f)
{
if (IsBigEndian())
return floatSWAP(f);
else
return f;
}
double BEdouble(double df)
{
if (IsBigEndian())
return df;
else
return doubleSWAP(df);
}
double LEdouble(double df)
{
if (IsBigEndian())
return doubleSWAP(df);
else
return df;
}
int main(void)
{
float f, sf;
double df, sdf;
unsigned char * ch;
f = 32.45;
sf = floatSWAP(f);
printf("%f:%f\n%f\n",f,sf,BEfloat(f));
ch = (unsigned char *) &f;
printf("%1x%1x%1x%1x:",*ch,*(ch+1),*(ch+2),*(ch+3));
ch = (unsigned char *) &sf;
printf("%1x%1x%1x%1x\n\n",*ch,*(ch+1),*(ch+2),*(ch+3));
df = 10.23456789;
sdf = doubleSWAP(df);
printf("%13.10g:%13.10g\n%13.10g\n",df,sdf,BEdouble(df));
ch = (unsigned char *) &df;
printf("%1x%1x%1x%1x%1x%1x%1x%1x:",*ch,*(ch+1),*(ch+2),*(ch+3),*(ch+4),*(ch+5),*(ch+6),*(ch+7));
ch = (unsigned char *) &sdf;
printf("%1x%1x%1x%1x%1x%1x%1x%1x\n\n",*ch,*(ch+1),*(ch+2),*(ch+3),*(ch+4),*(ch+5),*(ch+6),*(ch+7));
if (IsBigEndian())
printf("This is Big-Endian machine.\n");
else
printf("This is Little-Endian machine.\n");
}