在C語言程式中,對常數做強制型別轉換當然不是沒有意義的,例如 (int)3.14 將只保留整數部分。即使是從整型轉換為整型也是有意義的,強制型別轉換可以限定常數的寬度。
例如下面這行C語言賦值語句:
該語句執行完成後,res 中的數值將為 0xff,而不是 0xffff。當然了,在實際的C語言程式開發中,也可以將 ret 宣告為 unsigned char 型,這樣就可以省去對常數 0xffff 的強制型別轉換了。
如果題主覺得上面這個例子沒有實際應用價值,再來看下面這段C語言程式碼:
編譯並執行這段C語言程式碼,會輸出什麼呢?請看:
居然不是 14600000000!事實上,這段簡短的C語言程式碼常常會讓初學者百思不得其解,甚至會懷疑C語言或者計算機有問題,出故障了。
其實原因很簡單,就是資料溢位了而已。以我的機器為例,在C語言程式的計算過程中,所有乘數預設都是 int 型的,上述C語言程式碼中的兩個常數的乘法運算結果顯然超出了 int 型能夠表示的最大資料,當然會出錯了。
這其實是一個隱藏的較深的錯誤,稍微有些經驗的C語言程式設計師能夠避開變數的資料溢位,因為C語言中的變數總是需要使用資料型別定義的,而某種資料型別能夠表達的資料範圍,程式設計師心裡一般都有一把標尺。但是常數導致的資料溢位,很多程式設計師就容易忽略了。
要改正上述C語言程式碼的錯誤其實很簡單,只需將任意一個乘數轉換為寬度更寬的資料型別就可以了,相關C語言程式碼如下,請看:
編譯並執行這段C語言程式碼,發現輸出與預期一致了。
可見,題目中的“強制型別轉換後,還是那個數”的說法是不準確的,在C語言程式中,即使是對常數強制型別轉換,也是有意義的。
在C語言程式中,對常數做強制型別轉換當然不是沒有意義的,例如 (int)3.14 將只保留整數部分。即使是從整型轉換為整型也是有意義的,強制型別轉換可以限定常數的寬度。
例如下面這行C語言賦值語句:
int res = (unsigned char)0xffff;該語句執行完成後,res 中的數值將為 0xff,而不是 0xffff。當然了,在實際的C語言程式開發中,也可以將 ret 宣告為 unsigned char 型,這樣就可以省去對常數 0xffff 的強制型別轉換了。
如果題主覺得上面這個例子沒有實際應用價值,再來看下面這段C語言程式碼:
編譯並執行這段C語言程式碼,會輸出什麼呢?請看:
居然不是 14600000000!事實上,這段簡短的C語言程式碼常常會讓初學者百思不得其解,甚至會懷疑C語言或者計算機有問題,出故障了。
其實原因很簡單,就是資料溢位了而已。以我的機器為例,在C語言程式的計算過程中,所有乘數預設都是 int 型的,上述C語言程式碼中的兩個常數的乘法運算結果顯然超出了 int 型能夠表示的最大資料,當然會出錯了。
這其實是一個隱藏的較深的錯誤,稍微有些經驗的C語言程式設計師能夠避開變數的資料溢位,因為C語言中的變數總是需要使用資料型別定義的,而某種資料型別能夠表達的資料範圍,程式設計師心裡一般都有一把標尺。但是常數導致的資料溢位,很多程式設計師就容易忽略了。
要改正上述C語言程式碼的錯誤其實很簡單,只需將任意一個乘數轉換為寬度更寬的資料型別就可以了,相關C語言程式碼如下,請看:
編譯並執行這段C語言程式碼,發現輸出與預期一致了。
可見,題目中的“強制型別轉換後,還是那個數”的說法是不準確的,在C語言程式中,即使是對常數強制型別轉換,也是有意義的。