先来看一个程序:
1
2
3
4
5
6
7
8
9
10
11
|
#include<iostream>
int main()
{
unsigned a=5;
int b=-10;
std::cout<<b+b<<std::endl; //正常输出
std::cout<<a+b<<std::endl;
return 0;
}
|
打印:-20
4294967291
-20正常打印我们都知道,但当一个有符号和一个无符号之间的数进行相加减会发生什么呢?
是这样的:a+b,首先把负数转换为无符号数,然后在进行运算。
b转换为无符号数就是对b取模,2^32+b,结果为4294967286。
再看:
1
2
3
4
5
6
7
8
9
|
#include<iostream>
int main()
{
unsigned a=10,b=5;
std::cout<<b-a<<std::endl;
return 0;
}
|
打印:4294967291
其过程是对运算后的结果-5取模
循环中的发现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include<iostream>
int main()
{
unsigned u=5;
while (u>=0)
{
--u;
std::cout<<u<<std::endl;
}
return 0;
}
|
运行结果将是无限打印,原因是:当u=0时,仍能进去循环,然后u=-1了,由于u的类型是unsigned则被取模转换了,则u总是大于0的,所以是无限循环。
此时应将while里面的条件改成:u>0,当u=0时不能进去循环,u不是小于0也就没有类型转换,则循环能终止。
到此这篇关于C++有符号和无符号之间的转换的文章就介绍到这了,更多相关c++有符号无符号转换内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/weixin_50295944/article/details/117571227