float a=6.6;
char d=(char)a;
char *c=(char*)&a;
printf("%A\n",a);
printf("%d \n",d);
printf("%d\n",*c);
结果当浮子是怎么截断是:C语言:正投烧焦
0X1.A66666P+2
6
51
我不明白为什么秒施法打印51
float a=6.6;
char d=(char)a;
char *c=(char*)&a;
printf("%A\n",a);
printf("%d \n",d);
printf("%d\n",*c);
结果当浮子是怎么截断是:C语言:正投烧焦
0X1.A66666P+2
6
51
我不明白为什么秒施法打印51
一个'浮点数“只是一个数字表示形式的IEEE 754标记,它使用1位符号,8位指数(^ 2)和23位尾数(如果您计算隐含1的24位),则为十进制数字。
所以,你的浮点数6.6实际上是与价值01000000110100110011001100110011
,或十六进制相同数量的32位,40 d3 33 33
当你投炭*c=(char*)&a;
你实际上是在做C地点到32的第一个字节
浮点数的位,你指向最低的0x33
,你记得,十进制的十六进制数33 = 51。
该结果是实现定义的。它取决于几个因素,如系统的字节顺序和用于表示浮点数的格式。
假设您的系统使用IEEE-754号码,float
的十六进制表示为0x40D33333
(calculator)。
该浮点数的起始字节是0x40
或0x33
,具体取决于字节顺序。看起来你的系统中的字节是以相反的顺序存储的,所以最初的字节是0x33
,即十进制的51。当您通过投射指针将float
的字节重新解释为单个值char
时,将会打印此内容。
6.6存储在内存中的IEEE 754表示(0x40d33333
)中。
在您正在处理的小端系统上,&a[0]
是最不重要的字节0x33
= 51d
。
当您参考变量(如第二个演员表)时,C将IEEE 754解释为浮点数。
取消引用指针(*((char*)&a)
)将底层内存表示呈现给您。
这是C语言的保佑(或诅咒新手)。
参见:
https://www.wikiwand.com/en/IEEE_floating_point
http://www.h-schmidt.net/FloatConverter/IEEE754.html
“炭C =(炭)&一个” 铸就变量a的地址为char指针,而不是它的内容自。当您取消引用字符指针时,程序不知道指针指向的类型,因此它在内存位置需要一个字节并将其视为字符类型。
int a = 0x01020304;
char *c = (char*) &a;
printf("%d\n", *c);
上述声明应打印出1或4,取决于系统的“字节序”:
也许,如果使用整数,而不是更容易理解。 (在Windows上,它将打印出04)。
请参阅在[这个问题]最高的投票答案(https://stackoverflow.com/questions/24270637/typecasting-from-int-float-char-double)。 – kaylum