问个运算问题。

[复制链接]
3502|6
 楼主| lucidmask 发表于 2011-9-23 15:08 | 显示全部楼层 |阅读模式
int a,b ,c;
c= (int)((unsigned int)a +(unsigned int)b);

请问上面的运算在数值都在-1000到1000这间,运算是否正确?为什么?
感觉这种写法有问题,但是运算结果是正确的,不知该怎么理解
ayb_ice 发表于 2011-9-23 15:34 | 显示全部楼层
本帖最后由 ayb_ice 于 2011-9-23 15:36 编辑

主要原因在于变量长度一样,长度不一样就可能有问题
有符号的
-1+1=0
如果强制转换成无符号的则就是
65535+1=65536=0x10000只保留16位就是0x0000=0
因为int型的-1在内存中的值就是65535
不同长度的变量表示-1是不一样的
char x = -1; // 0xff
int   x = -1; // 0xffff
long x = -1; // 0xffffffff
 楼主| lucidmask 发表于 2011-9-23 15:40 | 显示全部楼层
关键是上述运算在没有溢出时,是正确的,上述代码是用工具自动生成的。不理解为什么int 转成 unsigned int
后再转为int是正确的
ccxlslr 发表于 2011-9-23 15:52 | 显示全部楼层
主要原因在于变量长度一样,长度不一样就可能有问题
有符号的
-1+1=0
如果强制转换成无符号的则就是
65535+1=65536=0x10000只保留16位就是0x0000=0
因为int型的-1在内存中的值就是65535
不同长度的变量表示-1是不一样 ...
ayb_ice 发表于 2011-9-23 15:34


呵呵,算半天还是0
liang2008xing 发表于 2011-9-23 16:17 | 显示全部楼层
a+b<65535/2应该结果就是a+b吧,楼主的问题应该考试中才会出现,哈哈
 楼主| lucidmask 发表于 2011-9-23 16:31 | 显示全部楼层
a+b
liang2008xing 发表于 2011-9-23 16:17

不是的,a+b 要在int 类型的数据值范围内才正确
liang2008xing 发表于 2011-9-23 16:54 | 显示全部楼层
学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

314

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部