日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...

發布時間:2025/4/16 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本節書摘來自華章計算機《編寫高質量代碼:改善c程序代碼的125個建議》一書中的第1章,建議4-1,作者:馬 偉 更多章節內容可以訪問云棲社區“華章計算機”公眾號查看。

建議4-1:整數轉換為新類型時必須做范圍檢查

關于整數類型數據的轉換原則,在C99的6.3.1.3節中做了非常重要的闡述,其表達的主要意思如下:
當我們將一個整數類型的數據轉換成除_Bool類型之外的另一個整數類型時,如果這個值可以被新的整數類型所表示,那么它就不會被修改,可以正確轉換;如果所轉換的新類型是無符號的,那么這個值就會反復加上或減去這個新類型可以表示的最大值加1,直到這個值位于這種新類型的范圍之內;如果所轉換的新類型是有符號的,并且這個值無法用新類型表示,那么它的結果是由編譯器定義的。
因此,為了保證整型數據轉換時不會發生丟失或錯誤解釋數據的情況,我們必須做一定的范圍檢查,以保證要轉換的數據的值在新類型的取值范圍之內。而在頭文件limits.h中就定義了相關整型數據的取值范圍,例如,在VC++ 2010中定義的limits.h部分代碼如下所示:

#define CHAR_BIT 8 /* number of bits in a char */ #define SCHAR_MIN (-128) /* minimum signed char value */ #define SCHAR_MAX 127 /* maximum signed char value */ #define UCHAR_MAX 0xff /* maximum unsigned char value */ #ifndef _CHAR_UNSIGNED #define CHAR_MIN SCHAR_MIN /* mimimum char value */ #define CHAR_MAX SCHAR_MAX /* maximum char value */ #else #define CHAR_MIN 0 #define CHAR_MAX UCHAR_MAX #endif /* _CHAR_UNSIGNED */ #define MB_LEN_MAX 5 /* max. # bytes in multibyte char */ #define SHRT_MIN (-32768) /* minimum (signed) short value */ #define SHRT_MAX 32767 /* maximum (signed) short value */ #define USHRT_MAX 0xffff /* maximum unsigned short value */ #define INT_MIN (-2147483647 - 1) /* minimum (signed) int value */ #define INT_MAX 2147483647 /* maximum (signed) int value */ #define UINT_MAX 0xffffffff /* maximum unsigned int value */ #define LONG_MIN (-2147483647L - 1) /*minimum(signed) long value */ #define LONG_MAX 2147483647L /* maximum (signed) long value */ #define ULONG_MAX 0xffffffffUL /* maximum unsigned long value */ #define LLONG_MAX 9223372036854775807i64 /* maximum signed long long int value */ #define LLONG_MIN (-9223372036854775807i64 - 1) /* minimum signed long long int value */ #define ULLONG_MAX 0xffffffffffffffffui64 /* maximum unsignedlong long int value */#define _I8_MIN (-127i8 - 1) /* minimum signed 8 bit value */ #define _I8_MAX 127i8 /* maximum signed 8 bit value */ #define _UI8_MAX 0xffui8 /* maximum unsigned 8 bit value */ #define _I16_MIN (-32767i16 - 1) /* minimum signed 16 bit value */ #define _I16_MAX 32767i16 /* maximum signed 16 bit value */ #define _UI16_MAX 0xffffui16 /* maximum unsigned 16 bit value */ #define _I32_MIN (-2147483647i32 - 1) /* minimum signed 32 bit value */ #define _I32_MAX 2147483647i32 /* maximum signed 32 bit value */ #define _UI32_MAX 0xffffffffui32 /*maximum unsigned 32 bit value*/ /* minimum signed 64 bit value */ #define _I64_MIN (-9223372036854775807i64 - 1) /* maximum signed 64 bit value */ #define _I64_MAX 9223372036854775807i64 /* maximum unsigned 64 bit value */ #define _UI64_MAX 0xffffffffffffffffui64 #if _INTEGRAL_MAX_BITS >= 128 /* minimum signed 128 bit value */ #define _I128_MIN (-170141183460469231731687303715884105727i128 - 1) /* maximum signed 128 bit value */ #define _I128_MAX 170141183460469231731687303715884105727i128 /* maximum unsigned 128 bit value */ #define _UI128_MAX 0xffffffffffffffffffffffffffffffffui128 #endif

舉個例子,從一種無符號類型轉換為一種有符號類型時,就可能發生數據的高位被截斷而導致數據丟失,或者符號位丟失,所以在轉換之前要對取值范圍進行驗證。下面的示例代碼演示了如何從unsigned int類型轉換為signed char類型:

unsigned int ui1=12345; signed char sc1; if(ui1>SCHAR_MAX) { } else {sc1=(signed)ui1; }

同樣,如果將有符號類型轉換為無符號類型,也必須進行取值范圍的驗證,示例代碼如下所示:

signed int si1=-12345; unsigned int ui1= 0; if(si1<0||si1>UINT_MAX) { } else {ui1=(unsigned int)si1; }

在數據類型由“高級向低級”轉換的時候,同樣必須進行取值范圍驗證,示例代碼如下所示:

long long int lli1=LLONG_MAX; int i1= 0; if(lli1<INT_MIN||lli1>INT_MAX) { } else {i1=(int)lli1; }

總結

以上是生活随笔為你收集整理的《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。