回覆列表
  • 1 # IT劉小虎

    在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語言程式中,即使是對常數強制型別轉換,也是有意義的。

  • 中秋節和大豐收的關聯?
  • 長黑頭諷刺是什麼原因?