前言
当算术表达式中既有无符号数又有带符号数时,那么在进行运算之前,这个有符号数值会先被转换成无符号数!然后再进行运算。
无符号数和有符号数比较的时候,有符号数值也会先被转换成无符号数
有符号->无符号 转换规则
对于同样字节大小的 有符号数和无符号数,强制类型转换的结果保持位值不变,只是改变了解释位的方式。
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;
}