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。
答案 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
的十六进制表示为0x40D33333
(calculator)。
该浮点数的初始字节为0x40
或0x33
,具体取决于字节顺序。看起来在您的系统上,字节以相反的顺序存储,因此初始字节为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)。