gpt4 book ai didi

c++ - 从大端转换为小端C++

转载 作者:行者123 更新时间:2023-11-30 04:12:38 24 4
gpt4 key购买 nike

我正在做一项家庭作业,打印出 intfloat 的大小端值。我在转换为 little endian 时遇到问题。

这是我的代码

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 但我不知道为什么。我已经尝试了很多不同的方法,但我无法让它工作。

如有任何帮助,我们将不胜感激。

最佳答案

显然在您的系统上,char 是一个带符号的 8 位类型。使用无符号 8 位字节,1234 的 4 字节小尾数法表示为 0xd2, 0x04, 0x00, 0x00。但是当在大多数系统上解释为带符号的 char 时,0xd2 变为 -0x2e

然后调用 printfchar 提升为 int,值为 -0x2e,然后 printf(不是很安全的类型)读入一个 unsigned int,您在其中传递了 int。这是未定义的行为,但在大多数系统上,它与 static_cast 相同,因此在尝试打印第一个字节时得到值 0xFFFFFFD2

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

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

关于c++ - 从大端转换为小端C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19759175/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com