1

我正在做一项家庭作业,以打印出 and 的大端和小端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's 但我不知道为什么。我已经尝试了很多不同的方法,但我无法让它发挥作用。

任何帮助将不胜感激。

4

1 回答 1

2

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

然后调用将其printf提升charintwith value -0x2e,然后printf(这不是非常安全的)读取unsigned int您传递int. 这是未定义的行为,但在大多数系统上它将与 a 相同,因此您在尝试打印第一个字节时static_cast会获得该值。0xFFFFFFD2

如果你坚持使用unsigned char而不是char在这些函数中,你可以避免这个特殊问题。

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

于 2013-11-04T00:07:00.083 回答