> 文章列表 > 【C++】for循环因size(),size_t,无符号数溢出死循环的问题

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

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

CSAPP中也有对数字在计算机中的表示的讨论。

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

前言

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

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

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

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

 unsigned a = 4294967295u; // Umaxint 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;
}