本節書摘來自華章計算機《編寫高品質代碼:改善c程式代碼的125個建議》一書中的第1章,建議4-1,作者:馬 偉 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
關于整數類型資料的轉換原則,在c99的6.3.1.3節中做了非常重要的闡述,其表達的主要意思如下:
當我們将一個整數類型的資料轉換成除_bool類型之外的另一個整數類型時,如果這個值可以被新的整數類型所表示,那麼它就不會被修改,可以正确轉換;如果所轉換的新類型是無符号的,那麼這個值就會反複加上或減去這個新類型可以表示的最大值加1,直到這個值位于這種新類型的範圍之内;如果所轉換的新類型是有符号的,并且這個值無法用新類型表示,那麼它的結果是由編譯器定義的。
是以,為了保證整型資料轉換時不會發生丢失或錯誤解釋資料的情況,我們必須做一定的範圍檢查,以保證要轉換的資料的值在新類型的取值範圍之内。而在頭檔案limits.h中就定義了相關整型資料的取值範圍,例如,在vc++ 2010中定義的limits.h部分代碼如下所示:
舉個例子,從一種無符号類型轉換為一種有符号類型時,就可能發生資料的高位被截斷而導緻資料丢失,或者符号位丢失,是以在轉換之前要對取值範圍進行驗證。下面的示例代碼示範了如何從unsigned int類型轉換為signed char類型:
同樣,如果将有符号類型轉換為無符号類型,也必須進行取值範圍的驗證,示例代碼如下所示:
在資料類型由“進階向低級”轉換的時候,同樣必須進行取值範圍驗證,示例代碼如下所示: