打印

问个运算问题。

[复制链接]
2408|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lucidmask|  楼主 | 2011-9-23 15:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
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

使用特权

评论回复
5
liang2008xing| | 2011-9-23 16:17 | 只看该作者
a+b<65535/2应该结果就是a+b吧,楼主的问题应该考试中才会出现,哈哈

使用特权

评论回复
6
lucidmask|  楼主 | 2011-9-23 16:31 | 只看该作者
a+b
liang2008xing 发表于 2011-9-23 16:17

不是的,a+b 要在int 类型的数据值范围内才正确

使用特权

评论回复
7
liang2008xing| | 2011-9-23 16:54 | 只看该作者
学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

47

主题

308

帖子

0

粉丝