Saltar al contenido principal
LibreTexts Español

2.5: Desbordamiento binario

  • Page ID
    154491
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Una advertencia con números binarios firmados es la de desbordamiento, donde la respuesta a un problema de suma o resta excede la magnitud que se puede representar con el número asignado de bits. Recuerda que el lugar del bit de señal se fija desde el inicio del problema. Con el problema del último ejemplo, usamos cinco bits binarios para representar la magnitud del número, y el bit más a la izquierda (sexto) como el bit de peso negativo, o signo, bit. Con cinco bits para representar la magnitud, tenemos un rango de representación de 2 5, o treinta y dos pasos enteros de 0 a máximo. Esto significa que podemos representar un número tan alto como +31 10 (011111 2), o tan bajo como -32 10 (100000 2). Si configuramos un problema de suma con dos números binarios, el sexto bit usado para signo, y el resultado o bien supera +31 10 o es menor que -32 10, nuestra respuesta será incorrecta. Intentemos sumar 17 10 y 19 10 para ver cómo funciona esta condición de desbordamiento para números positivos excesivos:

    aq.PNG

    ¡La respuesta (100100 2), interpretada con el sexto bit como el lugar -32 10, en realidad es igual a -28 10, no a +36 10 como deberíamos conseguir con +17 10 y +19 10 sumados! Obviamente, esto no es correcto. ¿Qué salió mal? La respuesta radica en las restricciones del campo numérico de seis bits dentro del cual estamos trabajando Dado que la magnitud de la suma verdadera y apropiada (36 10) excede el límite permitido para nuestro campo de bits designado, tenemos un error de desbordamiento. En pocas palabras, seis lugares no dan suficientes bits para representar la suma correcta, por lo que cualquier cifra que obtengamos usando la estrategia de descartar el bit de “acarreo” más a la izquierda será incorrecta. Un error similar ocurrirá si sumamos dos números negativos juntos para producir una suma que es demasiado baja para nuestro campo binario de seis bits. Intentemos sumar -17 10 y -19 10 juntos para ver cómo funciona esto (¡o no funciona, según sea el caso!) :

    az.PNG

    La respuesta (incorrecta) es veintiocho positiva. El hecho de que la suma real de diecisiete negativos y diecinueve negativos fuera demasiado baja para ser representada adecuadamente con un campo de magnitud de cinco bits y un bit de sexto signo es la causa raíz de esta dificultad. Probemos de nuevo estos dos problemas, excepto que esta vez usando el séptimo bit para un bit de signo, y permitiendo el uso de 6 bits para representar la magnitud:

    bh.PNG

    Al usar campos de bits suficientemente grandes para manejar la magnitud de las sumas, llegamos a las respuestas correctas. En estos problemas de muestra hemos podido detectar errores de desbordamiento realizando los problemas de adición en forma decimal y comparando los resultados con las respuestas binarias. Por ejemplo, al sumar +17 10 y +19 10 juntos, sabíamos que se suponía que la respuesta era +36 10, así que cuando la suma binaria se comprobó para ser -28 10, supimos que algo tenía que estar mal. Si bien esta es una forma válida de detectar desbordamiento, no es muy eficiente. Después de todo, toda la idea de complementación es poder sumar números binarios de manera confiable y no tener que volver a verificar el resultado sumando los mismos números juntos en forma decimal! Esto es especialmente cierto con el propósito de construir circuitos electrónicos para sumar cantidades binarias: el circuito tiene que ser capaz de comprobarse a sí mismo por desbordamiento sin la supervisión de un ser humano que ya sabe cuál es la respuesta correcta. Lo que necesitamos es un método simple de detección de errores que no requiera ninguna aritmética adicional. Quizás la solución más elegante es verificar el signo de la suma y compararlo con los signos de los números agregados. Obviamente, dos números positivos sumados deberían dar un resultado positivo, y dos números negativos sumados deberían dar un resultado negativo. Observe que cada vez que teníamos una condición de desbordamiento en los problemas de ejemplo, el signo de la suma siempre fue opuesto a los dos números agregados: +17 10 más +19 10 dando -28 10, o -17 10 más -19 10 dando +28 10. Al revisar solo los letreros podemos decir que algo anda mal. Pero, ¿qué pasa con los casos en los que se suma un número positivo a un número negativo? Qué signo debe ser la suma para que sea correcta. O, más precisamente, ¿qué signo de suma indicaría necesariamente un error de desbordamiento? La respuesta a esto es igualmente elegante: ¡nunca habrá un error de desbordamiento cuando se sumen dos números de signos opuestos! La razón de esto es evidente cuando se considera la naturaleza del desbordamiento. El desbordamiento ocurre cuando la magnitud de un número excede el rango permitido por el tamaño del campo de bits. La suma de dos números con signo idéntico puede muy bien superar el rango del campo de bits de esos dos números, por lo que en este caso el desbordamiento es una posibilidad. Sin embargo, si se agrega un número positivo a un número negativo, la suma siempre estará más cerca de cero que cualquiera de los dos números agregados: su magnitud debe ser menor que la magnitud de cualquiera de los números originales, y así el desbordamiento es imposible. Afortunadamente, esta técnica de detección de desbordamiento se implementa fácilmente en circuitos electrónicos, y es una característica estándar en los circuitos sumadores digitales: un tema para un capítulo posterior.


    This page titled 2.5: Desbordamiento binario is shared under a GNU Free Documentation License 1.3 license and was authored, remixed, and/or curated by Tony R. Kuphaldt (All About Circuits) via source content that was edited to the style and standards of the LibreTexts platform.