unsigned int 与 int 相加的问题

JYYCOM 2008-10-17 12:15:29
#include<iostream.h>
int main()
{unsigned int x=9;
int y=-20;
int m=(x+y>9)?1:0;
int z=x+y;

cout<<x+y<<endl;
cout<<"m is "<<m<<endl;
cout<<"z is "<<z<<endl;
}
为什么x+y的值变为一个很大的正数
而 z=x+y等于-11
unsigned int 与 int 是如何相加的

...全文
1681 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackzhhuang 2008-10-17
  • 打赏
  • 举报
回复
哪个能表示更大的数就转为哪个类型。例如short+long,就要转为long

在32位机上
unsigned int 最大可表示2^32 - 1
int最大可表示2^31-1
这样int就转为了unsigned int,由于y<0,即y的最高位符号位是1,转为unsigned int后最高为不再是符号位,而是一个最高位的正数,于是两者相加就会是一个很大的正数了。

也许你会问为什么“哪个能表示更大的数就转为哪个类型”?

因为计算机(注意,是计算机,不是编译器,也不是操作系统)总是希望能尽量大的囊括结果,防止溢出产生错误(尽管有人会说向下溢出怎么办,但别忘了,负数加减换成补码也成了正数的加运算)。
qkhhxkj102 2008-10-17
  • 打赏
  • 举报
回复
mark
jintianfree 2008-10-17
  • 打赏
  • 举报
回复
机器在数据都是由二进制补码表示的

正数的补码就是其本身

负数的补码是符号位不变各位取反再加一

8位机的话:

int a -1; 在机器中1111 1111
unsigned int b 1; 在机器中0000 0001

如果 a+b

a就转化为unsigned int 但里面的数值是不变的 1111 1111 把他转化成十进制2^8-1 + b

数就会很大了
帅得不敢出门 2008-10-17
  • 打赏
  • 举报
回复
signed
与unsigned的符号位问题
arong1234 2008-10-17
  • 打赏
  • 举报
回复
问题不在于相加,而在于你的z
x+y本身的类型是unsigned long,因此是一个很大的正数,当你赋值给z时,等于把一个很大的unsigned类型的数转换为signed的,当然就变成-11 了,你看看(unsigned long)(-11)等于多少就明白了
[Quote=引用楼主 JYYCOM 的帖子:]
#include <iostream.h>
int main()
{unsigned int x=9;
int y=-20;
int m=(x+y>9)?1:0;
int z=x+y;

cout < <x+y < <endl;
cout < <"m is " < <m < <endl;
cout < <"z is " < <z < <endl;
}
为什么x+y的值变为一个很大的正数
而 z=x+y等于-11
unsigned int 与 int 是如何相加的
[/Quote]
JYYCOM 2008-10-17
  • 打赏
  • 举报
回复
本来想加分,一天以后才行
JYYCOM 2008-10-17
  • 打赏
  • 举报
回复
学习了!
谢谢大家
cellulose 2008-10-17
  • 打赏
  • 举报
回复
unsigned 与signed 进行运算时,signed会被转为unsigned

所以 (-1 > 1) 一定是true
crazy115043370 2008-10-17
  • 打赏
  • 举报
回复
顶6楼
tangxuankai 2008-10-17
  • 打赏
  • 举报
回复
恩学习~~~
fenghuijun135 2008-10-17
  • 打赏
  • 举报
回复
unsinged int 和int相加的时候,要把signed int 转换成无符号的,然后再相加。
WangLy_2008 2008-10-17
  • 打赏
  • 举报
回复
学习了.......
jia_xiaoxin 2008-10-17
  • 打赏
  • 举报
回复
unsigned int x=9;
int y=-20;
int m=(x+y>9)?1:0; //x+y的结果被存在了一个临时变量里,而系统默认这个临时变量是unsigned int 型
//这种情况要用强制类型 int m = (int(x+y)>9)?1:0;
int z=x+y; //将结果用int型表示,也就是有符号型,所以正确

cout << y+x << endl; //跟上面的解释类似
//用 printf("%d", x+y); 这样输出结果被转化为有符号型
cout << "m is " << m << endl;
cout << "z is " << z << endl;

64,701

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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