2015-10-15 73 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)。