在开发中经常会遇到有符号和无符号之间的转换问题,如果不清楚问题根源,很难解决bug,今天小编通过本文给大家分享c++有符号无符号转换问题,需要的朋友参考下
先来看一个程序:
#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。
再看:
#include<iostream>
int main()
{
unsigned a=10,b=5;
std::cout<<b-a<<std::endl;
return 0;
}
打印:4294967291
其过程是对运算后的结果-5取模
循环中的发现:
#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++有符号无符号转换内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:C++有符号和无符号之间的转换问题
猜你喜欢
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言手把手带你掌握带头双向循环链表 2023-04-03
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- C++ 数据结构超详细讲解顺序表 2023-03-25
- C语言qsort()函数的使用方法详解 2023-04-26
- C语言详解float类型在内存中的存储方式 2023-03-27
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- Easyx实现扫雷游戏 2023-02-06
- Qt计时器使用方法详解 2023-05-30