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