我有根狼牙棒 2017-11-16 01:36 采纳率: 50%
浏览 10407
已采纳

如何理解32位有符号整数

题目描述
给定两个正整数a,b,且a>b,计算a-b,
难点在于,这里a,b未必能够用32位有符号整数表示。

输入
输入有多组数据,每组为一对a,b占一行,且a>b,范围均为1~10^24

输出
输出a和b的差
困惑:这里的a,b 该用什么定义,还需加点什么?

  • 写回答

4条回答 默认 最新

  • threenewbee 2017-11-16 01:58
    关注

    说下原理,为了方便,我们用4位无符号整数/4位有符号整数来说明,你可以推广到32位。

    在四位无符号整数中,咱们是这么表示的
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    分别是二进制的
    0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
    而有符号整数,前面不变,还是 0 1 2 3 4 5 6 7,后面变了,变成了-8 -7 -6 -5 -4 -3 -2 -1
    按照和有符号整数(以及上面二进制)对应排列起来就是 0 1 2 3 4 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1
    所以,要算减法,我们只要把每个数字+8(无论正负),因为减数被减数都+8,所以差不变。
    0 1 2 3 4 5 6 7 这个 +8简单,直接+,结果变成 8 9 10 11 12 13 14 15
    -8 -7 -6 -5 -4 -3 -2 -1 这个+8要注意,它们在无符号中事实上相当于 8 9 10 11 12 13 14 15
    而我们实际上要得到0 1 2 3 4 5 6 7,所以我们实际上是减8

    所以我们需要判断,如果原来的数字 > 0x7(也就是十进制的7),那么-8,否则+8

    推广到32位,就是
    如果大于 0x7FFFFFFF,那么减去 0x80000000
    如果小于 0x7FFFFFFF,那么加上 0x80000000
    然后再让调整过的两个数直接相减。
    之前写错了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料