二进制算术 - 带溢出的加法
Binary arithmetic - addition with overflow
当我需要减去 2 个数字 (X-Y) 时,我可以取 Y 的 2 的补码并将其加到 X。假设我们的系统使用一个字节(8 位)表示整数。
X = 7 = 00000111
Y = 5 = 00000101
2 的 5 补码
11111010 + 1 = 11111011
加上那 2 =
00000111
11111011
__________
100000010
有结转。如何处理这种结转?
如果我使用 8 位,这意味着我的范围是 -128 到 127。所以 7 和 -5 以及它们的和不会超出该范围。所以这不是溢出。
应该再读一遍我的课本:)
在 2 的补码算法中,进位被丢弃,而 1 的补码算法则将进位带回并添加到结果中。
这个视频帮助我理解了 - https://www.youtube.com/watch?v=lKTsv6iVxV4
这取决于你想做什么
如果您只是计算 simple/single +/-
操作
那么通常忽略溢出
当你需要处理overflow/underflow
例如如果你出于某种原因需要限制结果(通常是结果范围的安全......)那么如果发生溢出下溢则ALU标记的进位标志.之后,根据输入 sign,magnitude
和操作 (+,-)
,将结果设置为最大正值或负值。 Aome 平台有自动执行此操作的指令(饱和添加,减去)。
另一个原因是在这种情况下进行 bigint
操作,将进位添加为 +/-1
到更高的操作(符号取决于操作)......但结果本身保持原样(add,adc,adc,adc,...
)
在现代 languages/platforms 你不再有直接的 ALU 标志寄存器访问权限
有时您可以利用汇编程序,但在某些情况下它可能比计算本身慢。在那种情况下使用这种方法 32bit ALU in C++ 其中 cy
是进位标志
当我需要减去 2 个数字 (X-Y) 时,我可以取 Y 的 2 的补码并将其加到 X。假设我们的系统使用一个字节(8 位)表示整数。
X = 7 = 00000111
Y = 5 = 00000101
2 的 5 补码
11111010 + 1 = 11111011
加上那 2 =
00000111
11111011
__________
100000010
有结转。如何处理这种结转?
如果我使用 8 位,这意味着我的范围是 -128 到 127。所以 7 和 -5 以及它们的和不会超出该范围。所以这不是溢出。
应该再读一遍我的课本:)
在 2 的补码算法中,进位被丢弃,而 1 的补码算法则将进位带回并添加到结果中。
这个视频帮助我理解了 - https://www.youtube.com/watch?v=lKTsv6iVxV4
这取决于你想做什么
如果您只是计算 simple/single
+/-
操作那么通常忽略溢出
当你需要处理overflow/underflow
例如如果你出于某种原因需要限制结果(通常是结果范围的安全......)那么如果发生溢出下溢则ALU标记的进位标志.之后,根据输入
sign,magnitude
和操作(+,-)
,将结果设置为最大正值或负值。 Aome 平台有自动执行此操作的指令(饱和添加,减去)。另一个原因是在这种情况下进行
bigint
操作,将进位添加为+/-1
到更高的操作(符号取决于操作)......但结果本身保持原样(add,adc,adc,adc,...
)在现代 languages/platforms 你不再有直接的 ALU 标志寄存器访问权限
有时您可以利用汇编程序,但在某些情况下它可能比计算本身慢。在那种情况下使用这种方法 32bit ALU in C++ 其中
cy
是进位标志