2011-09-25 10 views
5

Me he enfrentado a una pregunta de la entrevista relacionada con los sistemas integrados y C/C++. La pregunta es:cuando se multiplican dos datos firmados de 16 bits, ¿cuál debería ser el tamaño de la resultante?

Si multiplicamos 2 datos firmados (complemento 2) de 16 bits, ¿cuál debería ser el tamaño de los datos resultantes?

He empezado a intentar con un ejemplo de la multiplicación de dos firmaron 4 bits, por lo que, si multiplicamos +7 y -7, nos encontramos con -49, que requiere 7 bits. Pero no pude formular una relación general.

Creo que necesito entender la multiplicación binaria para resolver esta pregunta.

Respuesta

3

Esto dependerá del contexto. En C/C++, todos los productos intermedios más pequeños que int se promueven a int. Entonces, si int tiene más de 16 bits, el resultado será un entero de 32 bits con signo.

Sin embargo, si lo asigna de nuevo a un entero de 16 bits, se truncará dejando solo 16 bits del complemento a dos del nuevo número.

Entonces, si su definición de "resultado" es el intermedio inmediatamente siguiente a la multiplicación, entonces la respuesta es el tamaño de int. Si define el tamaño como después de haberlo guardado de nuevo en una variable de 16 bits, entonces la respuesta es el tamaño del tipo de entero de 16 bits.

+0

Esta pregunta es independiente del lenguaje, pero es un conocimiento útil para los programadores C y C++. –

7

En primer lugar, el entero con signo de n bits contiene un valor en el rango - (2^(n-1)) .. + (2^(n-1)) - 1. Por ejemplo, para n = 4, el rango es - (2^3) .. (2^3) -1 = -8 .. + 7

El rango del resultado de la multiplicación es -8 * + 7 .. -8 * -8 = -56 .. + 64.

+64 es más que 2^6-1 - ¡es 2^6 = 2^(2n-2)! Necesitará 2n-1 bits para almacenar dicho entero POSITIVO.

A menos que esté haciendo codificación de propiedad (vea el siguiente párrafo) - necesitará 2n bits: Un bit para el signo, y 2n-1 bits para el valor absoluto del resultado de la multiplicación.

Si M es el resultado de la multiplicación, puede almacenar -M o M-1 en su lugar. esto puede ahorrarle 1 bit.

Cuestiones relacionadas