C语言:在转换为char时如何将float截断

时间:2015-10-15 02:35:53

标签: c floating-point

float a=6.6;
char d=(char)a;
char *c=(char*)&a;
printf("%A\n",a);
printf("%d \n",d);
printf("%d\n",*c);

结果是:

0X1.A66666P+2
6 
51

我不明白为什么第二次演员打印51。

4 个答案:

答案 0 :(得分:2)

'浮点'数字只是32位计算IEEE 754的十进制数的数字表示,它使用1位表示符号,8位表示指数(^ 2),23位表示尾数(如果算数则为24位)隐含的1)

所以,您的浮点数6.6实际上是32位,值为01000000110100110011001100110011,或者是十六进制的相同数字,40 d3 33 33

当你制作演员字符*c=(char*)&a;时,你实际上是指向浮点数的32位的第一个字节,你指的是你记得的最低0x33,十六进制33 =十进制51.

答案 1 :(得分:2)

此结果是实现定义的。它取决于几个因素,例如系统的字节顺序和用于表示浮点数的格式。

假设您的系统使用IEEE-754号码,float的十六进制表示为0x40D33333calculator)。

该浮点数的初始字节为0x400x33,具体取决于字节顺序。看起来在您的系统上,字节以相反的顺序存储,因此初始字节为0x33,或十进制为51。当您通过强制转换指针将float的字节重新解释为单个char值时,就会打印出来。

答案 2 :(得分:2)

6.6以IEEE 754表示形式(0x40d33333)存储在内存中 在您正在处理的小端系统上,&a[0]是最不重要的字节0x33 = 51d

当你引用变量时(如在第二次演员中),C在浮动中将IEEE 754解释为6.6。 取消引用指针*((char*)&a))会向您公开底层内存表示 这是C语言的祝福(或诅咒新手)。

请参阅:
https://www.wikiwand.com/en/IEEE_floating_point
http://www.h-schmidt.net/FloatConverter/IEEE754.html

答案 3 :(得分:1)

“char c =(char )& a”将变量a的地址强制转换为char指针,而不是它自己的内容。当您取消引用字符指针时,程序不知道指针指向的类型,因此它在内存位置占用一个字节并将其视为char类型。

或许,如果您使用整数,则更容易理解:

int a = 0x01020304;
char *c = (char*) &a;
printf("%d\n", *c);

上述语句应打印出1或4,具体取决于系统的“字节顺序”。 (在Windows上,它将打印出04)。