回覆列表
  • 1 # 使用者7223288951684

    CPU沒有變數型別的概念。如果硬要說有,那就是有整型和浮點型的區別而已。題主應該是沒有學過彙編,如果想具體地瞭解清楚可以學習彙編之後再來看該程式編譯出的彙編程式碼。因為彙編程式碼基本上就是CPU在執行該程式時真正依照的指令。

    回到原問題上,其實對於這個程式,正常的編譯器基本都會發現x的值在整個程式中都沒有改變,從而直接去掉變數x,將整個程式最佳化為功能類似於如下的C程式碼printf("%c","a");printf("%d","a");

    不過我們依照題主的意思,不對程式進行編譯時最佳化,那麼事實上的程式流程多半是下面這樣(要想看到事實上的流程還是要看程式彙編程式碼):將值65(即"a"的ASCII碼)存至32位暫存器A從暫存器A取出值並以字元形式列印(即將65對應的字元"a"打印出來)從暫存器A取出值並以整數形式列印(即列印65)

    可以看到以上程式碼中並沒有出現型別轉換。事實上,char與int的區別(也包括short與int的區別等),都只是C語言中對於資料型別劃分的一種標準,凡是C語言中長度小於等於32位的資料型別在32位CPU中的表現形式都是一樣的(即32位暫存器)。但如果需要將資料存入記憶體,以上的資料型別所佔的長度就可能會不相同,這裡也要考慮記憶體對齊等話題,不作深入探討。

    總之,C語言中,char與int在32位CPU上沒有區別,而在記憶體中也僅有長度區別。本質上都是整數。字元型的本質也只是一個儲存著字元ASCII碼的整型變數。在這些型別中做資料型別轉換時,底層硬體看到的幾乎只有資料長度的變化而已。

    附註:有符號型變數與無符號型變數,整型變數與浮點型變數在相互轉換時,除了資料長度,資料內容也可能發生變化。詳情還請自行了解這些資料型別的編碼格式。

  • 中秋節和大豐收的關聯?
  • thinkpad+e540+15.6英寸膝上型電腦怎麼樣?