最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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)換的評論 (共 條)

分享到微博請遵守國家法律
巴彦淖尔市| 苗栗县| 嵊州市| 临颍县| 海丰县| 罗甸县| 定陶县| 南木林县| 汕尾市| 永定县| 宝坻区| 定州市| 巴彦县| 中方县| 三明市| 静宁县| 武强县| 永嘉县| 扶沟县| 合江县| 延川县| 株洲县| 兴安县| 敦煌市| 万州区| 太仓市| 海南省| 洪湖市| 洛浦县| 游戏| 扎囊县| 甘谷县| 手机| 乌拉特中旗| 鹤岗市| 湄潭县| 朝阳区| 翁牛特旗| 灵石县| 南澳县| 浑源县|