2015-10-15 68 views
1
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

+0

请参阅在[这个问题]最高的投票答案(https://stackoverflow.com/questions/24270637/typecasting-from-int-float-char-double)。 – kaylum

回答

2

一个'浮点数“只是一个数字表示形式的IEEE 754标记,它使用1位符号,8位指数(^ 2)和23位尾数(如果您计算隐含1的24位),则为十进制数字。

所以,你的浮点数6.6实际上是与价值01000000110100110011001100110011,或十六进制相同数量的32位,40 d3 33 33当你投炭*c=(char*)&a;你实际上是在做C地点到32的第一个字节

浮点数的位,你指向最低的0x33,你记得,十进制的十六进制数33 = 51。

2

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

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

该浮点数的起始字节是0x400x33,具体取决于字节顺序。看起来你的系统中的字节是以相反的顺序存储的,所以最初的字节是0x33,即十进制的51。当您通过投射指针将float的字节重新解释为单个值char时,将会打印此内容。

1

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

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

上述声明应打印出1或4,取决于系统的“字节序”:

也许,如果使用整数,而不是更容易理解。 (在Windows上,它将打印出04)。