最大负数的绝对值的问题!

jeisy 2008-07-03 01:55:46
在看 K&R的C语言程序设计,里面有个问题:
就是如果一个整形为最大负数,在求反时,得不到相应的正数。这种情况我们应该怎么处理?并如果做到与机器无关?

我实在想不出来怎么处理,请大侠们帮忙!
...全文
611 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeisy 2008-07-03
  • 打赏
  • 举报
回复
那也就是说,我们在取负数的绝对值的时候,就是用unsigned强制转换了啊!这样才能保证最大负数的问题,并且和机器无关!

大家都是这样做的吗?
sukyin 2008-07-03
  • 打赏
  • 举报
回复
与机器无关的话,直接用unsigned 对应的类型强制转换就行。
如果其他的方法难免会跟系统扯上什么关系。
K行天下 2008-07-03
  • 打赏
  • 举报
回复


绝对值最大的负数是 10...0 后面31个0, 32位平台 int (其范围是 –2,147,483,648 -》 2,147,483,647)
是–2,147,483,648
取反得到的数是:2,147,483,647
比负数的绝对值小1

要转换的话,只能使用unsigned
xkyx_cn 2008-07-03
  • 打赏
  • 举报
回复
负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
所以对于有符号数,最大负数的绝对值比最大正数要大1
如果你想得到其绝对值,直接用unsigned type强转就可以了:


int imax = INT_MIN;
cout << hex << showbase << imax << endl;
cout << (unsigned)imax << endl;
cout << ~imax << noshowbase << endl;

cout << dec << showbase << imax << endl;
cout << (unsigned)imax << endl;
cout << ~imax << noshowbase << endl;

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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