跳至内容
响水凹
欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki
用户工具
登录
站点工具
搜索
工具
显示页面
过去修订
反向链接
最近更改
媒体管理器
网站地图
登录
>
最近更改
媒体管理器
网站地图
您的足迹:
computer:c:tips:use_of_unsigned
本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
====== 无符号类型的使用建议 ====== 很多地方都提到了无符号数(unsigned): * [[.:sign_of_char | char类型的符号问题]] * [[.:unary_conversions | 一元转换(Unary conversions)]] * [[.:binary_conversions | 二元转换(Binary conversions)]] * [[.:overflow | 关于溢出(Overflow)]] * [[.:unary_minus_and_unsigned | 一元减号与无符号数]] * [[.:binary_subtraction_and_unsigned | 二元减法与无符号数]] * [[.:bitwise_shift | 移位操作符的注意事项]] C语言中无符号类型的一些特性与“直觉”不同,因此,在处理无符号数时要多加小心。 比如下面这个有符号数和无符号数混用的例子: <code c> int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int main(void) { int d = -1, x; ... if (d <= TOTAL_ELEMENTS - 2) x = array[d + 1]; ... } </code> 代码没有如预期运行,因为sizeof的返回值类型size_t是一个无符号类型(至少为unsigned int),导致变量d类型提升,变成一个很大的无符号数,从而if判断为假。 下面是一些关于无符号数的使用建议: * 一般情况下,尽量不用无符号类型,以免增加不必要的复杂性。尤其不要仅仅因为无符号数没有负值,而用它来表示一些非负数量(如年龄)。 * 尽量使用int这样的有符号类型,这样在涉及混合类型提升等复杂细节时,不必担心边界情况(如-1转换成很大的正数)。 * 在位操作和结构体位域的地方,使用无符号类型,以保证可移植性。 * 尽量避免有符号类型和无符号类型的混用场合,实在不行,应该使用强制转换来明确表达期望的转换方式,而不是交由编译器来选择。 比如上例的if判断,可做如下修改: <code c> if (d <= (int)TOTAL_ELEMENTS - 2) </code> {{tag>C语言}}
computer/c/tips/use_of_unsigned.txt
· 最后更改: 2014/11/01 02:02 由
127.0.0.1
页面工具
显示页面
过去修订
反向链接
回到顶部