我正在完成一项家庭作业,打印出int
和float
的大和小端值。我很难转换成小端。
这是我的代码
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
,但我不知道为什么。我尝试过这么多不同的方法,但我无法让它发挥作用。
非常感谢任何帮助。
答案 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指出的那样,这整个方法根本不可移植。)