进位和溢出(Carry & Overflow)

问题: 设有两个8位BIT的数A=a7a6a5a4a3a2a1a0, B=b7b6b5b4b3b2b1b0.进位标志CF, 溢出标志OF.则:
计算C=A+B时,OF=? CF=? 计算C=A-B时, OF=? CF=?

    网上找了半天,总说什么有符号数,无符号数,看晕了.二进制形式的一个数,你怎么知道它是有符号的还是无符号的?只好写程序试验了.程序是将0到255之间任意两个数相加,将产生溢出或者进位的数找出来.

  1. .section .data
  2. flow:
  3.   .asciz "%3d + %3d = %3d/tOverflow/n"
  4. carry:
  5.   .asciz "%3d + %3d = %3d/tCarry/n"
  6. both_no:
  7.   .asciz "%3d + %3d = %3d/tNone occured./n"
  8. both:
  9.   .asciz "%3d + %3d = %3d/tBoth occured./n"
  10. .section .text
  11. .globl _start
  12. _start:
  13.   movl $0, %ecx
  14.   movl $0, %edx
  15. begin:
  16.   movb %cl, %al
  17.   movb %dl, %bl
  18.   addb %bl, %al
  19.   jc has_carry
  20.   jo has_flow
  21.   jmp loop_inc
  22.   pushl %ecx
  23.   pushl %edx
  24.   movzx %al, %ebx
  25.   pushl %ebx
  26.   movzx %dl, %ebx
  27.   pushl %ebx
  28.   movzx %cl, %ebx
  29.   pushl %ebx
  30.   push $both_no
  31.   call printf
  32.   addl $16, %esp
  33.   popl %edx
  34.   popl %ecx
  35. loop_inc:
  36.   incb %dl
  37.   cmpb $0, %dl
  38.   jnz loop_end
  39.   incb %cl
  40.   cmpb $0, %cl
  41.   jz end
  42.   movb %cl, %dl
  43. loop_end:
  44.   jmp begin
  45. has_carry:
  46.   jo has_both
  47.   pushl %ecx
  48.   pushl %edx
  49.   movzx %al, %ebx
  50.   pushl %ebx
  51.   movzx %dl, %ebx
  52.   pushl %ebx
  53.   movzx %cl, %ebx
  54.   pushl %ebx
  55.   push $carry
  56.   call printf
  57.   addl $16, %esp
  58.   popl %edx
  59.   popl %ecx
  60.   jmp loop_inc
  61. has_flow:
  62.   pushl %ecx
  63.   pushl %edx
  64.   movzx %al, %ebx
  65.   pushl %ebx
  66.   movzx %dl, %ebx
  67.   pushl %ebx
  68.   movzx %cl, %ebx
  69.   pushl %ebx
  70.   push $flow
  71.   call printf
  72.   addl $16, %esp
  73.   popl %edx
  74.   popl %ecx
  75.   jmp loop_inc
  76. has_both:
  77.   pushl %ecx
  78.   pushl %edx
  79.   movzx %al, %ebx
  80.   pushl %ebx
  81.   movzx %dl, %ebx
  82.   pushl %ebx
  83.   movzx %cl, %ebx
  84.   pushl %ebx
  85.   push $both
  86.   call printf
  87.   addl $16, %esp
  88.   popl %edx
  89.   popl %ecx
  90.   jmp loop_inc
  91. end:
  92.   movl $1, %eax
  93.   movl $0, %ebx
  94.   int $0x80
通过对结果的分析,得出以下溢出和进位的确定方式:
  • 不管你把数据视为无符号还是有符号,计算时自动把最高位视为符号位.当两个符号位相同的数做加法时,如果结果的符号位发生变化,则为溢出.
  • 当两个符号位不同的数做减法时,以A-B=C为例,如果A与C的符号位不同则为溢出.
  • 其它情况下均不会有溢出.
  • 关于进位:
  • 当两个数相加的结果的长度增大时会产生进位.
  • 如果将数看作无符号的(不管机器如何看待它们),小数减大数一定发生进位,即"借位"也被视为进位,英文叫"CARRY".大数减小数永远不会产生进位.
  • 两个N位的数相加的结果大于2N - 1时发生进位.否则不发生进位.
由此可以看出,进位和溢出可以同时发生,也可以同时都不发生.进位不一定溢出,溢出也不一定进位.
   


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值