请教无符号数相减

王大大大楠 2011-09-16 09:22:52
请问无符号数相减怎么算啊?特别是小值减大值的时候
比如0-0x8000 0000=?
...全文
617 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-16
  • 打赏
  • 举报
回复
unsigned short int a,b;
a=0u;
b=0x8000u
if (a>b) printf("a比b多%u\n",a-b);
else printf("a比b少%u\n",b-a);
子谋 2011-09-16
  • 打赏
  • 举报
回复
从编程规范上来讲……
无符号数不能做小减大的运算,这会导致向下溢出,运算结果是一个巨大的数值……
无符号数的减法必须先判断再运算,而且必须是大数减小数……
如果LZ想找个偷机取巧的方法也不是没有……
实际上,无符号运算和有符号运算步骤是完全一样的,0-1会得到一个巨大的正数值,而这个数实际上就是-1的补码,这时候只要检测一下这个数的最高位是否为1,为1则表示向下溢出,你只要把这个数按位取反再加一,就会得到结果1,也就是0-1的绝对值,这样就可以免去判断大小的步骤,效率比较高……
不过极力不推荐这种方法,对于编程来说,安全性永远都比效率更重要……
turing-complete 2011-09-16
  • 打赏
  • 举报
回复
减数取反 + 1
王大大大楠 2011-09-16
  • 打赏
  • 举报
回复
脑残了,不好意思》。。[Quote=引用 6 楼 nice_cxf 的回复:]
引用 5 楼 wangxn_007 的回复:
谢谢,可是照你的这个算法出来是不是等于0x2000 0000

引用 2 楼 nice_cxf 的回复:
=0x0x8000 0000,相当于0x10000 0000 -0x8000 0000

0x是16进制不是10进制,怎么可能是0x2000 0000
[/Quote]
nice_cxf 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangxn_007 的回复:]
谢谢,可是照你的这个算法出来是不是等于0x2000 0000

引用 2 楼 nice_cxf 的回复:
=0x0x8000 0000,相当于0x10000 0000 -0x8000 0000
[/Quote]
0x是16进制不是10进制,怎么可能是0x2000 0000
王大大大楠 2011-09-16
  • 打赏
  • 举报
回复
谢谢,可是照你的这个算法出来是不是等于0x2000 0000[Quote=引用 2 楼 nice_cxf 的回复:]
=0x0x8000 0000,相当于0x10000 0000 -0x8000 0000
[/Quote]
we_sky2008 2011-09-16
  • 打赏
  • 举报
回复

if ((unsigned)-0x80000000 == 0x80000000)
printf("(unsigned)-0x80000000 == 0x80000000\n");
we_sky2008 2011-09-16
  • 打赏
  • 举报
回复
内存的二进制位是不区分什么无符号数还是有符号数的,只有解析这些内存时才区分
0-0x8000 0000 == -0x8000 0000
取反加1之后就是0x80000 0000
nice_cxf 2011-09-16
  • 打赏
  • 举报
回复
=0x0x8000 0000,相当于0x10000 0000 -0x8000 0000

69,373

社区成员

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

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