编程中使用无符号类型潜在的问题

       在C和C++中,无符号类型的数和有符号类型的数做算术运算时,一般会将有符号的数默认转化成无符号的数,比如无符号整数和有符号整数算术运算时,有符号整数默认转化成无符号整数,但是这存在着巨大的问题,当有符号整数为负数时,比如为-1,它转化成无符号整数时是一个非常大的数,往往会对运算带来意想不到的结果。

#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那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况。只有在使用位段和二进制掩码时,才可以用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者为无符号数,这样就不比由编译器来选择结构的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值