从大端转换为小端c ++

时间:2013-11-03 22:51:03

标签: c++ endianness

我正在完成一项家庭作业,打印出intfloat的大和小端值。我很难转换成小端。

这是我的代码

void convertLitteE(string input)
{
    int theInt;
    stringstream stream(input);
    while(stream >> theInt)
    {
        float f = (float)theInt;

        printf("\n%d\n",theInt);
        printf("int:   0x");
        printLittle((char *) &theInt, sizeof(theInt));

        printf("\nfloat: 0x");
        printLittle((char *) &f, sizeof(f));
        printf("\n\n");
    }
}

void printLittle(char *p, int nBytes)
{
    for (int i = 0; i < nBytes; i++, p++)
    {
        printf("%02X", *p);
    }
}

当输入为12时,我得到了我期望的结果

output:
int:   0x0C000000
float: 0x00004041

但输入为1234时

output:
int:   0xFFFFFFD20400000
float: 0x0040FFFFFFF9A44

但我希望

int :  0xD2040000
float: 0x00409A44

当我单步执行for循环时,我可以看到似乎存在垃圾值的位置,然后它会打印所有F,但我不知道为什么。我尝试过这么多不同的方法,但我无法让它发挥作用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

显然在您的系统上,char是带符号的8位类型。使用无符号8位字节,1234的4字节little-endian表示将是0xd2, 0x04, 0x00, 0x00。但在大多数系统上解释为已签名的char时,0xd2会变为-0x2e

然后,对printf的调用将char提升为值int的{​​{1}},然后-0x2e(不是非常类型安全)读入printf您通过unsigned int的地方。这是未定义的行为,但在大多数系统上它将与int相同,因此在尝试打印第一个字节时会得到值static_cast

如果您坚持在这些功能中使用0xFFFFFFD2而不是unsigned char,则可以避免此特定问题。

(但正如@jogojapan指出的那样,这整个方法根本不可移植。)