我遇到了与嵌入式系统和C / C ++相关的面试问题。问题是:
如果我们将2个带符号(2的补码)16位数据相乘,那么结果数据的大小应该是多少?
我已经开始尝试将两个带符号的4位相乘,所以,如果我们乘以+7
和-7
,我们最终会得到-49
,这需要7位。但是,我无法形成一般关系。
我认为我需要深入理解二进制才能解决这个问题。
答案 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位整数类型的大小。