【发布时间】:2021-07-20 17:42:54
【问题描述】:
让我们以Add 和Multiply 为例。哪一项可以归类为加宽?
假设输入是 2 的补码中的有符号字符(即长度为 8 位),除非另有声明。
正数加法
1+2 = 3
这个操作似乎没有扩大。 1、2 和 3 都适合一个角色。
但是,250 + 6 会溢出无符号字符。那么这是扩大范围了吗?
签名类型也可以这样做,125 + 5 将带符号的字符溢出到符号位中。这是在扩大吗?
负数加法
-2-3 = -5
这会使二进制中的字符溢出 1 位:
1 1 1 1 1 1 1 0
+ 1 1 1 1 1 1 0 1
------------------
1 1 1 1 1 1 0 1 1
溢出通常会被丢弃,但是,这是否被认为是扩大操作?
正数乘法
1 * 2 = 2
所有乘法是否都在扩大,即使结果仍然适合原始数据类型?
上面的例子,2 仍然适合 8 位字符,但是,如果我用二进制手动进行数学运算,额外的 0s 会附加到结果的左侧,从而被丢弃。
负数乘法
-2 * -3 = 6
为简单起见,假设我们的输入是 4 位。这溢出了预期大小的两倍,即结果变为 8 位:
1110 * 1101 = 10110110
高4位被丢弃,低4位等于6。
这算不算加宽操作?
分部
我没有详细介绍除法,但我认为它被认为是一种缩小操作。
【问题讨论】:
-
你对“扩大”的定义是什么?
-
我没有,这主要是个问题,已知的加宽是什么?
-
从 8+9=17 开始,不就是说加法是“加宽”了吗?
-
好点,我将它添加到正数加法中。
-
很多地方,例如:stackoverflow.com/a/68041066/14940626,
Widening signed-multiply doesn't involve any truncation...
标签: assembly cpu-architecture twos-complement integer-arithmetic