Binary 当两个16位有符号数据相乘时,结果的大小应该是多少?
我曾面临一个有关嵌入式系统和C/C++的面试问题。问题是: 如果我们将2个有符号(2的补码)16位数据相乘,结果数据的大小应该是多少 我开始尝试将两个有符号4位相乘,因此,如果我们将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位整数,它将截短新数字的两个补码中的
+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++程序员。