编程中使用无符号类型潜在的问题
2014-04-24 09:25
183 查看
在C和C++中,无符号类型的数和有符号类型的数做算术运算时,一般会将有符号的数默认转化成无符号的数,比如无符号整数和有符号整数算术运算时,有符号整数默认转化成无符号整数,但是这存在着巨大的问题,当有符号整数为负数时,比如为-1,它转化成无符号整数时是一个非常大的数,往往会对运算带来意想不到的结果。
这个程序的if中的判断语句将为假,因此程序什么也不会输出。因为sizeof() 返回的是无符号整数,if语句字signed int 和unsigned int 之间测试相等性,d被升级为unsigned int类型,是一个非常大的正整数,因此表达式为假。
对无符号类型的建议:
尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况。只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者为无符号数,这样就不比由编译器来选择结构的类型。
#include <iostream> using namespace std; int array[] = {1, 3, 5, 7, 9}; #define TOTAL_ELEMENTS ( ( sizeof(array) ) / ( sizeof(*array) ) ) int main() { int d = -1, x; if(d <= TOTAL_ELEMENTS-2) { x = array[d+1]; cout<<x<<endl; } return 0; }
这个程序的if中的判断语句将为假,因此程序什么也不会输出。因为sizeof() 返回的是无符号整数,if语句字signed int 和unsigned int 之间测试相等性,d被升级为unsigned int类型,是一个非常大的正整数,因此表达式为假。
对无符号类型的建议:
尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况。只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者为无符号数,这样就不比由编译器来选择结构的类型。
相关文章推荐
- 翻译《有关编程、重构及其他的终极问题?》——9.使用'-0'符号作为结尾标记
- Java编程long数据类型的使用问题
- IDE使用问题:vc2003中类型无法转到声明和定义,按F12提示未定义的符号(CSDN一个帖子)
- socket编程小问题:地址已经被使用——Address already in use
- CSP编程基础--CryptAPI使用过程中碰到的问题
- AIDL中使用自定义类型时无法导包的问题
- 使用pcap_findalldevs_ex 编程出现问题
- 国外大神说-在编程中使用If语句的潜在危险
- 使用prototype特性编程中的效率问题 (转)
- 关于宏定义中#和##符号的使用和宏定义展开问题
- Java 泛型高级编程 ? 类型占位符的使用
- 使用chukwa的自定义数据类型收集日志配置问题
- STM8L在使用模拟IIC编程时遇到__iar_unhandled_exception的问题
- C/C++ -- Gui编程 -- Qt库的使用 -- Qt窗体的类型状态布局
- 使用PowerBuilder 9编绎DLL类型,有点问题.处理过程记录如下.”Error opening file ‘c:\windows\system32\cgen\en32t.h’”
- 《Java 编程技巧1001条》 第399条:对原始类型数组使用数组复制
- 【Java编程高级进阶】如何使用自定义类型的异常?
- js中关于逻辑符号的连续使用问题
- 使用反射解决实体类型转换问题 by hyw
- Ironpython及其他托管语言中值类型最好使用构造函数赋值,否则无法赋值的问题