首先,要知道一件事情:你在程式碼裡寫的事情,計算機未必會幹。
比如:
沒準人家編譯器看你沒有產生實際效用,就直接給砍了。
更嚴格來講,你應當寫:
這就有點實際意義了。
C的基本型別,大都能對應到CPU能處理的標準數字型別。char基本都是一個8位有符號整數,最高位是符號位。int是不低於16位的有符號整數(所有的常見平臺上都是32位),最高位是符號位。
那麼進行這種轉換,基本上就是編譯器把這件事情翻譯成一個或者幾個CPU指令,大概是:
對於ASCII,a的數值是97,用八位的二進位制數表示,就是01100001。把它轉換到int,實際上就是在求一個32位有符號的值,數值意義和01100001要相等。編譯器會把你這個表示式翻譯成對應的CPU操作。結果是00000000 00000000 00000000 01100001。
看起來好像除了填上一堆零,啥都沒幹?
實際上填零是重要操作,因為記憶體空間可以是髒的:在你給丫賦值之前,丫可能還帶著上次計算完之後的垃圾。
而且,如果是負數,就會很不一樣。比如:
由於現代計算機幾乎全都用補碼來表示負數,於是負一的8位二進位制表示,是11111111;而32位表示,則是11111111 11111111 11111111 11111111。不難看到,對於有符號數的長度轉換,並不總是填零的。
所以CPU在這裡面,還是需要做一些微小的工作。
======================
補充執行時型別的問題:
C這種語言,要的就是執行時不帶型別記號的裸奔快感。比如對於類似這樣的原始碼:
最後的那個相加,在不最佳化的情況下,通常會產生類似這樣的幾個指令:
可以看到,這裡面沒有型別。對資料的操作方式就是型別。
首先,要知道一件事情:你在程式碼裡寫的事情,計算機未必會幹。
比如:
沒準人家編譯器看你沒有產生實際效用,就直接給砍了。
更嚴格來講,你應當寫:
這就有點實際意義了。
一直對基本型別的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;可以看到,這裡面沒有型別。對資料的操作方式就是型別。