【C++】两个例子解决 unsigned int 与 int 运算问题

unsigned:unsigned int 的缩写。无符号类型,取值范围为 0 ~ (2^32-1)。需要注意:

  • 定义unsigned变量时需要保证为正数。
  • unsigned int 变量和int 变量在一起运算或比较时,会将int型转换为unsigned int型(算术运算的隐式转换)。
  • 超过unsigned范围时,会从范围的另一端取值(补码)。

由于上面三个特性的存在,衍生出很多问题:

1、unsigned int型和int 型比较大小

int -6会被转为 unsigned类型,unsigned -6 超过unsigned范围,会变为2^32 - 6,一个很大的正数。结果会输出 unsigned 5 < -6。

unsigned int a = 5;
if(a < -6){
    cout << "unsigned 5 < -6" << endl;
}

2、unsigned int型和int 型相加

第一个结果会输出 a+b > 0。

此时将a+b又赋值给w转回为int型,第二个结果输出 w<0, w = -20。

int a = -30;
unsigned int b = 10;
if( a + b > 0){
    cout << "a+b > 0" << endl;
}
 
int w = a+b;
if(w < 0){
    cout << "w < 0, w = " << w << endl;
}

3、和为0

注意当 int a = -10,unsigned int b = 10。或 int a = 10,unsigned int b = -10。输出 a + b = 0。 

	int a = -10;
	unsigned int b = 10;
	if(a+b > 0){  
        cout << "a+b>0" << endl;
	}
	if(a+b <0){
        cout << "a+b<0" << endl; 
	}
	if(a+b == 0){
        cout << "a+b=0" << endl; //输出这句话
	}

4、string.size()和负数比较大小,string.size()返回无符号正数,输出s.size() < -1。

vector.size()与-1比较时同样,vector的size是无符号整型,有符号整型被自动转化为无符号整型,出现负数大于size的情况。

string s;
if(s.size() < -1){
    cout << "s.size() < -1" << endl;
}

5、这种情况的出现主要是涉及到了隐式转换,不同类型的数据进行操作时,算术运算中的低类型会转换为高类型。

    若两整型分别为有符号和无符号,若无符号级别高,则无符号;否则,若有符号表示范围大,则有符号;否则,都转为有符号类型的无符号版本。

类型转换可以参考 https://akaedu.github.io/book/ch15s03.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值