c++ for循环因size(),size_t,无符号数溢出死循环的问题


前言

当算术表达式中既有无符号数又有带符号数时,那么在进行运算之前,这个有符号数值会先被转换成无符号数!然后再进行运算。

无符号数和有符号数比较的时候,有符号数值也会先被转换成无符号数


有符号->无符号 转换规则

对于同样字节大小的 有符号数和无符号数,强制类型转换的结果保持位值不变,只是改变了解释位的方式。

 unsigned a = 4294967295u; // Umax
 int b =(int)a;
 cout<<"a "<<a<<" b "<<b<<endl;

结果

a 4294967295 b -1

可以看到,无符号的4294967295补码形式-1 的 位模式是完全一样的。

一、案例一, for 循环误用unsigned

会出错,因为i无符号的, i等于0时,i–,溢出为4294967295 , 无符号数永远>=0 故会变成死循环

unsigned i;
for (i = 5; i >= 0; i--){
    cout<<i<<endl;
}

二、案例二, int 变 unsigned

会出错,因为sizeof返回值是无符号的, i-DELTA结果是无符号,无符号数永远>=0,故会变成死循环

#define DELTA sizeof(int)
int i;
for (i = 5; i-DELTA >= 0; i-= DELTA){
     cout<<i<<endl;
}

三、案例三,无符号size() 溢出

数组为空,size()==0时,本不应该有任何输出。
但是xxx.size()返回值为 无符号整型size_type 0,规范写为0u, 无符号整型0u -1 溢出 为 4294967295 ,所以输出会为 0 到 4294967295。若使用i作为数组下标索引,则会在成 内存错误

vector<int> dp;
for(int i=0;i<dp.size()-1;i++){
    cout<<i<<endl;
}

所以正确的写法如下:(int)dp.size() -1

    vector<int> dp;
    for(int i=0;i<(int)dp.size()-1;i++){
        cout<<i<<endl;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值