回覆列表
  • 1 # 使用者6270830956664

    首先,要知道一件事情:你在程式碼裡寫的事情,計算機未必會幹。

    比如:

    沒準人家編譯器看你沒有產生實際效用,就直接給砍了。

    更嚴格來講,你應當寫:

    這就有點實際意義了。

    一直對基本型別的cast疑惑不解

    C的基本型別,大都能對應到CPU能處理的標準數字型別。char基本都是一個8位有符號整數,最高位是符號位。int是不低於16位的有符號整數(所有的常見平臺上都是32位),最高位是符號位。

    那麼進行這種轉換,基本上就是編譯器把這件事情翻譯成一個或者幾個CPU指令,大概是:

    從地址var1讀內容到暫存器;執行8位到32位的有符號整數轉換;將結果從暫存器寫到地址var2,寫32位。

    對於ASCII,a的數值是97,用八位的二進位制數表示,就是01100001。把它轉換到int,實際上就是在求一個32位有符號的值,數值意義和01100001要相等。編譯器會把你這個表示式翻譯成對應的CPU操作。結果是00000000 00000000 00000000 01100001。

    看起來好像除了填上一堆零,啥都沒幹?

    實際上填零是重要操作,因為記憶體空間可以是髒的:在你給丫賦值之前,丫可能還帶著上次計算完之後的垃圾。

    而且,如果是負數,就會很不一樣。比如:

    由於現代計算機幾乎全都用補碼來表示負數,於是負一的8位二進位制表示,是11111111;而32位表示,則是11111111 11111111 11111111 11111111。不難看到,對於有符號數的長度轉換,並不總是填零的。

    所以CPU在這裡面,還是需要做一些微小的工作。

    ======================

    補充執行時型別的問題:

    C這種語言,要的就是執行時不帶型別記號的裸奔快感。比如對於類似這樣的原始碼:

    最後的那個相加,在不最佳化的情況下,通常會產生類似這樣的幾個指令:

    從地址a取32位資料到暫存器1;從地址b取32位資料到暫存器2;執行32位整形加法;將32位資料寫到地址c;

    可以看到,這裡面沒有型別。對資料的操作方式就是型別。

  • 中秋節和大豐收的關聯?
  • 無人駕駛坦克裝甲車輛的前景如何?