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

Binary 当两个16位有符号数据相乘时,结果的大小应该是多少?,binary,integer,multiplication,Binary,Integer,Multiplication,我曾面临一个有关嵌入式系统和C/C++的面试问题。问题是: 如果我们将2个有符号(2的补码)16位数据相乘,结果数据的大小应该是多少 我开始尝试将两个有符号4位相乘,因此,如果我们将+7和-7相乘,我们最终得到-49,这需要7位。但是,我不能建立一个一般的关系 我想我需要深入理解二进制乘法来解决这个问题。这取决于上下文。在C/C++中,所有小于int的中间产物都升级为int。因此,如果int大于16位,则结果将是一个有符号32位整数 然而,若您将它赋回一个16位整数,它将截短新数字的两个补码中的

我曾面临一个有关嵌入式系统和C/C++的面试问题。问题是:

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

我开始尝试将两个有符号4位相乘,因此,如果我们将
+7
-7
相乘,我们最终得到
-49
,这需要7位。但是,我不能建立一个一般的关系


我想我需要深入理解二进制乘法来解决这个问题。

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

然而,若您将它赋回一个16位整数,它将截短新数字的两个补码中的最后16位


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

首先,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位: 一位表示符号,2n-1位表示乘法结果的绝对值


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

这个问题是语言无关的,但它是有用的知识,为C和C++程序员。