当两个16位有符号数据相乘时,结果的大小应该是多少?

sus*_*sus 5 binary integer multiplication

我遇到了一个与嵌入式系统和C/C++相关的面试问题.问题是:

如果我们将2个带符号(2的补码)16位数据相乘,那么结果数据的大小应该是多少?

我已经开始与乘以两个带符号的4位的例子尝试,所以,如果我们乘+7-7,我们结束了-49,这需要7位.但是,我无法形成一般关系.

我想我需要深入理解二进制才能解决这个问题.

Lio*_*gan 7

首先,n位有符号整数包含范围内的值 - (2 ^(n-1)).. +(2 ^(n-1)) - 1.例如,对于n = 4,范围是 - (2 ^ 3)..(2 ^ 3)-1 = -8 .. + 7

乘法结果的范围是-8*+ 7 .. -8*-8 = -56 .. + 64.

+64大于2 ^ 6-1 - 它是2 ^ 6 = 2 ^(2n-2)!你需要2n-1比特来存储这样的POSITIVE整数.

除非您正在进行专有编码(参见下一段),否则您将需要2n位:符号为1位,乘法结果的绝对值为2n-1位.

如果M是乘法的结果,则可以存储-M或M-1.这可以为你节省1比特.


Mys*_*ial 3

这将取决于上下文。在 C/C++ 中,所有小于的中间体都int提升为int. 因此,如果int大于 16 位,则结果将是一个带符号的 32 位整数。

但是,如果将其分配回 16 位整数,它将被截断,仅留下新数字的二进制补码的底部 16 位。

因此,如果您对“结果”的定义是紧随乘法之后的中间值,那么答案就是 的大小int。如果将大小定义为将其存储回 16 位变量后,则答案是 16 位整数类型的大小。