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

时间:2011-09-25 18:12:13

标签: binary integer multiplication

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

  

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

我已经开始尝试将两个带符号的4位相乘,所以,如果我们乘以+7-7,我们最终会得到-49,这需要7位。但是,我无法形成一般关系。

我认为我需要深入理解二进制才能解决这个问题。

2 个答案:

答案 0 :(得分: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比特来存储这样的正整数。

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

如果M是乘法的结果,则可以存储-M或M-1。这可以为你节省一点。

答案 1 :(得分:3)

这取决于具体情况。在C / C ++中,所有小于int的中间体都被提升为int。因此,如果int大于16位,则结果将是带符号的32位整数。

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

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