謝邀。
在C語言程序中,對常數做強制類型轉換當然不是沒有意義的,例如(int)3.14將只保留整數部分。即使是從整型轉換為整型也是有意義的,強制類型轉換可以限定常數的寬度。
例如下面這行C語言賦值語句:
intres=(unsignedchar)0xffff;
該語句執行完成后,res中的數值將為0xff,而不是0xffff。當然了,在實際的C語言程序開發中,也可以將ret聲明為unsignedchar型,這樣就可以省去對常數0xffff的強制類型轉換了。
如果題主覺得上面這個例子沒有實際應用價值,再來看下面這段C語言代碼:
編譯并執行這段C語言代碼,會輸出什么呢?請看:
居然不是14600000000!事實上,這段簡短的C語言代碼常常會讓初學者百思不得其解,甚至會懷疑C語言或者計算機有問題,出故障了。
其實原因很簡單,就是數據溢出了而已。以我的機器為例,在C語言程序的計算過程中,所有乘數默認都是int型的,上述C語言代碼中的兩個常數的乘法運算結果顯然超出了int型能夠表示的最大數據,當然會出錯了。
這其實是一個隱藏的較深的錯誤,稍微有些經驗的C語言程序員能夠避開變量的數據溢出,因為C語言中的變量總是需要使用數據類型定義的,而某種數據類型能夠表達的數據范圍,程序員心里一般都有一把標尺。但是常數導致的數據溢出,很多程序員就容易忽略了。
要改正上述C語言代碼的錯誤其實很簡單,只需將任意一個乘數轉換為寬度更寬的數據類型就可以了,相關C語言代碼如下,請看:
編譯并執行這段C語言代碼,發現輸出與預期一致了。
可見,題目中的“強制類型轉換后,還是那個數”的說法是不準確的,在C語言程序中,即使是對常數強制類型轉換,也是有意義的。
歡迎在評論區一起討論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。