【发布时间】:2020-05-31 23:19:37
【问题描述】:
假设我们有以下二进制数及其表示形式:
| bin | unsigned | signed |
|:---:|----------|----------|
| 110 | 6 | -2 |
| 111 | 7 | -1 |
现在无论是签名还是未签名,111 + 110 = 1101,
现在我可以将结果 1101 解释为有符号或无符号,即:
| bin | unsigned | signed |
|:----:|----------|----------|
| 1101 | 13 | -3 |
与小数运算匹配的:
6+7 = 13
-1-2 = -3
signed addition 或 unsigned addition 之间没有区别。那么为什么 CPU 会有不同的电路/指令来进行这种操作呢?
【问题讨论】:
-
哪些CPU指令集有不同的有符号和无符号加法?一些指令可能具有立即参数的符号扩展模式,或者能够设置不同的标志,但是如果没有具体的例子就很难说。
-
@trentcl:大概只有一个补码机器有不同的
add指令。 (如果您不计算 MIPSadd与addu之类的东西;add会在 2 的补码有符号溢出时陷入陷阱,所以编译器对所有有符号和无符号的东西都使用addu。这不是真的 i> 有符号与无符号,它只是简单的添加,有/没有额外的有符号溢出陷阱。)我可以想象一些具有有限标志的机器有不同的添加,根据有符号溢出或无符号进位(又名溢出)设置“溢出”标志),取决于操作码,而不是同时设置不同的标志 -
@trentcl 所以在我的
add示例中,拥有2个差异(有符号和无符号)指令的唯一原因是查看溢出在哪里?当传递sign位时(即最大位之前的1)发生符号字溢出的含义,在传递最大位时发生无符号世界溢出,对吗?
标签: binary cpu cpu-architecture signed instructions