c語言的強制轉(zhuǎn)換
1. 對數(shù)據(jù)有改變:
很明顯的,有
float a = 3.25; //二進制數(shù)值:11.01
printf("%d\n", (int)a);
//結(jié)果為:
//3
對于a,是float型變量, 內(nèi)存的原數(shù)據(jù),并不是,直接存放a的二進制數(shù)值11.01,而是經(jīng)過一個固定算式的轉(zhuǎn)換【這里就不展開說明】
(int)a? 會先轉(zhuǎn)換,得到a的數(shù)值3.25, 然后閹割小數(shù)部分【閹割過程由cpu解決,我們不用管】,只留下3【二進制11】
數(shù)據(jù)是會發(fā)生變化的【這里的數(shù)據(jù),我猜的是在cpu計算時的數(shù)據(jù)】
?
2.對數(shù)據(jù)不改變:
float a = 3.25;
(int&)a; //這里并不改變內(nèi)存數(shù)據(jù),直接使用內(nèi)存原數(shù)據(jù)。
(int*)&a; //&a是float*型數(shù)據(jù), 強轉(zhuǎn)為int*數(shù)據(jù)。同樣不改變原數(shù)據(jù)。
對于C語言,一切皆數(shù)據(jù)

int b = 122; //char是最小整數(shù)型變量,范圍:[-128,127]
//只不過我們可以利用acsii碼表來表示字符。122 == 'z'
(char)b; //這里,也不會改變原數(shù)據(jù)。//由于大小端序的問題,也會帶來一些下面問題:
'z' == 122; ?122 == 0x7A;
'y' == 121; ?121 == 0x79;
printf("%c\n",0x7900007A);
//x86平臺,大端序原數(shù)據(jù)內(nèi)存里為0x7A 00 00 79,所以%c,只讀取最后一個字節(jié),0x7A, 也就是'z';
printf("%c\n",0x7A000079);
//類似上面printf("%c\n", (char)b);//結(jié)果:
z
y
z

? 所以像這種轉(zhuǎn)換(char)122,都不會改變數(shù)據(jù)。
別看著好像是 int? 轉(zhuǎn)? char 似乎類型變了,本質(zhì)上類型并沒有大變。?
char 1字節(jié)整型
int 4字節(jié)整型
long 8字節(jié)整型
其實這一串,都同源同根,只不過長度不一樣,能表示的范圍不一樣而已。
而char 只不過還用來表示字符量,但前提是,你得告訴電腦 (%c),【用該整形量表示字符】。
?我們再來看,指針類型強轉(zhuǎn),這也不改變數(shù)據(jù),只是改變類型
float a = 3.25;(int*)&a; //&a是float*型數(shù)據(jù), 強轉(zhuǎn)為int*數(shù)據(jù)。同樣不改變原數(shù)據(jù)。
int c = *(int *)&a; //這里跟 c = (int&)a 是一樣的,直接使用內(nèi)存的原數(shù)據(jù)
?
?
對于指針類型的強制轉(zhuǎn)換,其實精髓還是【一切皆數(shù)據(jù)】

char c = 'z';char *p = &a; //不改變數(shù)據(jù),&a多少,p就多少
(unsigned long)p; //這個數(shù)值跟p本身數(shù)據(jù),沒什么區(qū)別。p多少,(unsigned long)p就多少
(unsigned int)p; //這個上面說過,大小端序問題,只能讀到,最后4字節(jié)【本身p,8字節(jié)】
//以下數(shù)據(jù)都不改變,也不丟字節(jié),只改變類型。
(int *)p;
(float *)p;
(long *)p;
//同時,也帶來另一個影響:【影響內(nèi)存的解釋方式】
*(int *)p; //這里將以int的方式解釋p所指內(nèi)存的數(shù)據(jù),
// 'z' 即122,即0x7A, 大端序【7A, 非法內(nèi)存,非法,非法】
// 后面3字節(jié),并沒有申請,非法內(nèi)存,因此會出bug
//其他幾個類似

不過,通過* 訪問,這已經(jīng)是后面的事情了,
沒必要把 這個強轉(zhuǎn),跟后面的*訪問,綁一起,
本身是兩個過程。強轉(zhuǎn),在訪問前已經(jīng)結(jié)束。
還是那句話:【一切皆數(shù)據(jù)】
? 從 char * 類型,轉(zhuǎn)換成 int * 類型。數(shù)據(jù)沒變,類型變了而已,都是數(shù)據(jù)
?
?
?做一個總結(jié):
強轉(zhuǎn)有兩種類型:
1. 改變原數(shù)據(jù)
int和float 之間強轉(zhuǎn)
2.不改變原數(shù)據(jù)
類型改變方式:
1)丟字節(jié),來改變類型。
如:char a = 0x7A 00 00 79;? 丟三字節(jié),只拿到0x79【大端序】
2)不丟字節(jié),直接改變類型。
如:p是char* 數(shù)據(jù),(int*)p; 僅改變類型