关于无符号整型和符号整型自动类型转换的问题

specklelion 2016-05-16 01:27:06
http://www.52rd.com/Blog/Detail_RD.Blog_lentil_13982.html?WebShieldDRSessionVerify=4x3vZape3zHZAQNEc6LO

我是看到了这个帖子有了问题。大家知道如果一个无符号整型和符号整型做加法运算,系统会做类型提升,将符号整型变为无符号整型之后再与符号整型做加法。那如果符号整型的那个变量本身是负数,被变成符号整型,负号不是被去掉了吗?算出来的结果不是不正确了吗?

貼一下我发的链接的其中一段文字:
首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较:
unsigned int a=20;
signed int b=-130;
a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。
再举一个例子:
unsigned int a=20;
signed int b=-130;
std::cout<<a+b<<std::endl;
结果输出为4294967186,同样的道理,在运算之前,a=20,b被转化为4294967166,所以a+b=4294967186


我自己在Linux下做了运算,发现结果确实是这样。为什么编译器会出现这样的问题?这样不是很不方便吗,还是说这是coder应该注意的问题,要避免做这样的编写?
...全文
748 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
specklelion 2016-05-16
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
因为标准是这么规定的。 第二个例子,a+b的结果是unsigned in,按照unsigned int输出就是 4294967186,如果转成int类型,那么结果就是-110;
明白了!并且测试了一下, cout<<int(a+b)<<endl; 得出确实是-110! 还有,谢谢楼上的大家!!
fefe82 2016-05-16
  • 打赏
  • 举报
回复
这是 coder 应该注意的问题。
赵4老师 2016-05-16
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
  • 打赏
  • 举报
回复
因为标准是这么规定的。 第二个例子,a+b的结果是unsigned in,按照unsigned int输出就是 4294967186,如果转成int类型,那么结果就是-110;

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧