五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

c語言的強制轉(zhuǎn)換

2023-03-14 15:16 作者:程序員-王堅  | 我要投稿

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;  僅改變類型

          


c語言的強制轉(zhuǎn)換的評論 (共 條)

分享到微博請遵守國家法律
噶尔县| 乌拉特中旗| 鄂托克旗| 达孜县| 昭苏县| 上高县| 大田县| 平陆县| 张家港市| 台南县| 江华| 道真| 乌鲁木齐县| 开鲁县| 大丰市| 股票| 邯郸市| 孝义市| 迁西县| 延庆县| 道真| 体育| 隆子县| 芦山县| 全州县| 龙川县| 广元市| 蓝山县| 石城县| 剑川县| 郁南县| 寿宁县| 隆安县| 苍山县| 怀仁县| 紫阳县| 安陆市| 广宗县| 大英县| 双城市| 颍上县|