我的一个演讲幻灯片给出了一个算术溢出的例子,并在ARM芯片上传入一个条件分支标志的主题,引用如下:
据推测,为了示例,地址只能容纳8个字节。所以对我来说,似乎喜欢添加1到7FFFFFFF给出80000000.我认为80000000仍然适合8字节地址。
为什么这是算术溢出?幻灯片上的方法是错误的吗?或者我的理解是否有缺陷?
感谢您的回复
答案 0 :(得分:36)
答案 1 :(得分:6)
如果符号位已损坏,则会出现溢出。所以你知道你必须调整你的结果。
如果结果不符合此值,则会得到一个进位。 (需要比你更多的比特)。
在过去,您必须为多字节值编写自己的加法和乘法子程序。
答案 2 :(得分:0)
二进制补码的美妙之处在于 ADD 和 SUB 操作完全相同,因此您不需要对有符号和无符号值使用不同的指令。
然而,ALU 只处理一个 8 位数字存在一个问题,因此它不知道这些位是代表有符号数还是无符号数。
考虑两个操作:
255 (AKA -1) ADD 1 无论哪种方式,答案都是 0。但是,如果 255 表示 -1,则此操作很好 -1 ADD 1 = 0 没问题。 OTOH 如果 255 是无符号的 255 ADD 1 = 0 是错误的,所以 ALU 设置 C 标志说“如果这是一个无符号操作,它超出了界限”
127 添加 1 个答案 128(又名 -128)。如果 127 代表一个无符号数,这很好 127 ADD 1 = 128,但是如果它的有符号数 127 ADD 1 = -128 是错误的。因此,在这种情况下,ALU 设置了 V 标志,表示“如果这是一个有符号操作,则答案越界”
原则上你可以设计一个只有一个标志的 ALU,如果你有一点告诉它操作是有符号的还是无符号的。那么对于有符号和无符号操作,你会有不同的操作码。