¿El complemento de uno es un problema del mundo real o solo histórico?

8 minutos de lectura

Se hizo otra pregunta sobre la determinación de impar/par en C, y el enfoque idiomático (x y 1) se marcó correctamente como roto para basado en el complemento de uno que permite el estándar C.

¿Existen realmente los sistemas en el ‘mundo real’ fuera de los museos informáticos? He estado codificando desde la década de 1970 y estoy bastante seguro de que nunca he conocido a una bestia así.

¿Alguien está realmente desarrollando o probando código para tal sistema? Y, si no, ¿deberíamos preocuparnos por esas cosas o deberíamos ponerlas en Habitación 101 junto con cinta de papel y tarjetas perforadas…?

  • Sé que esta pregunta es antigua, pero cualquiera que la lea debe saber que (x & 1U) es válida (tenga en cuenta la U) para determinar pares/impares incluso en implementaciones de complemento a unos o de signo/magnitud.

    – R.. GitHub DEJA DE AYUDAR A ICE

    15 de octubre de 2010 a las 5:26

  • @R. ¿Está seguro?: En la compilación de 1 de 32 bits, -1 se representa como 0xFFFFFFFE, por lo que (0xFFFFFFFE y 0x00000001) = 0x00000000 = falso.

    – Roddy

    15 de octubre de 2010 a las 9:21

  • @Roddy: se requiere convertir un entero con signo negativo para calcular (MAX_INT+1- (-valor)) en todos los sistemas. Para los sistemas que usan matemáticas en complemento a dos, el resultado del cálculo tendrá la misma representación de bits que el entero con signo original y, por lo tanto, muchos compiladores simplemente reinterpretarán el valor sin generar ningún código para operar en él. Sin embargo, en sistemas con cálculo de complemento a uno o de magnitud con signo, el compilador tendría que generar código para el encasillado para garantizar un comportamiento definido.

    – Super gato

    13/10/2011 a las 17:40

  • @Supercat – ¡Interesante, gracias! re: (MAX_INT+1- (-valor)) – ¿tiene una fuente para eso? ¿Es solo en el estándar C99?

    – Roddy

    13/10/2011 a las 21:20

  • artículo de Wikipedia sobre representaciones de números con signo menciona que “los mainframes de la serie Unisys ClearPath Dorado utilizan el complemento de uno”.

    –Paul A. Clayton

    08/09/2014 a las 21:41

Trabajo en el campo de la telemetría y tenemos algunos de nuestros clientes que tienen viejos convertidores de analógico a digital que todavía usan el complemento de 1. Solo tuve que escribir código el otro día para convertir el complemento de 1 al complemento de 2 para compensar.

Así que sí, todavía está disponible (pero no te lo vas a encontrar muy a menudo).

  • La magnitud con signo, el binario compensado y el complemento a uno existen para E/S, pero en la práctica casi siempre se convierten por código a binario compensado o complemento a dos tan pronto como se leen.

    – Super gato

    13/10/2011 a las 17:55

  • ¿Podría alguien con la experiencia relevante dar algunos nombres de marca, URL o palabras clave de búsqueda que podrían ayudar a responder la pregunta del OP? Esta respuesta ayuda a cambiar mis palabras clave de búsqueda de “plataforma de complemento de los modernos” a “convertidor a2d de complemento de los modernos”, pero estoy seguro de que es posible ser más explícito.

    – Quuxplusone

    15 de enero de 2018 a las 19:04


  • ¿Tengo razón en que esta respuesta no está hablando de una plataforma C/C++ donde int usa de forma nativa la representación de complemento a uno en la memoria, pero simplemente está hablando de un formato de alambre (para hablar con algún dispositivo periférico) que especifica que los números negativos en algunos/todos los campos deben codificarse en complemento de unos? Si es así, esto es similar en espíritu al ejemplo anterior de RFC 791.

    – Quuxplusone

    15 de enero de 2018 a las 19:07

  • @Quuxplusone Creo que esto es diferente del ejemplo de RFC 971. El número de complemento a 1 de un ADC representaría una señal bipolar digitalizada (positiva y negativa). Este ADC podría usarse como entrada directamente en una máquina de complemento a 1, que a su vez podría procesarse en C/C++; pero no conozco ningún ejemplo de este tipo. Se menciona que los principales proveedores como Analog Devices alguna vez fabricaron este tipo de ADC, pero incluso sus materiales de referencia sugieren que son raros (cf. analog.com/media/en/training-seminars/design-handbooks/…)

    – chrstphrchvz

    26 de junio de 2018 a las 0:42

  • …Tal ADC probablemente también sería lo suficientemente viejo como para no usar ningún tipo de interfaz de comunicación serial o de paquetes; en cambio, los bits de la muestra digitalizada aparecerían en los pines del IC (“paralelo”).

    – chrstphrchvz

    26 de junio de 2018 a las 0:42

avatar de usuario
adam haile

Todo esto se reduce a conocer tus raíces.
Sí, esta es técnicamente una técnica antigua y probablemente haría lo que otras personas sugirieron en esa pregunta y usaría el operador de módulo (%) para determinar pares o impares. Pero entender qué es un complemento a 1 (o complemento a 2) siempre es bueno saberlo. Ya sea que los use o no, su CPU está lidiando con esas cosas todo el tiempo. Así que nunca está de más entender el concepto. Ahora, los sistemas modernos hacen que generalmente nunca tengas que preocuparte por cosas como esa, por lo que se ha convertido en un tema para los cursos de Programación 101 de alguna manera. Pero debe recordar que algunas personas todavía usarían esto en el “mundo real”… por ejemplo, contrariamente a la creencia popular, hay personas que ¡Aún usa ensamblaje! No muchos, pero hasta que las CPU puedan entender C# y Java sin procesar, alguien Todavía va a tener que entender estas cosas.

Y diablos, nunca se sabe cuándo podría encontrarse haciendo algo en lo que realmente necesita realizar matemáticas binarias y ese complemento de 1 podría ser útil.

  • Gracias. Esté completamente de acuerdo en que debe haberlo aprendido, pero no debe preocuparse por eso, como los bytes de 6 bits y cómo funciona la memoria central. Por cierto, es “complemento”, no “cumplido”. El elogio de uno podría ser “esa es una buena señal que llevas hoy”.

    – Roddy

    2 de octubre de 2008 a las 13:36

  • Hago muchas entrevistas a ingenieros de software, usando las Cinco Áreas de Steve Yegge (steve.yegge.googlepages.com/…), y es mejor que creas que una de las áreas es Bits and Bytes. Si quiere ser un buen SDE, debe comprender los sistemas numéricos binarios, y el complemento de uno y dos es parte de eso. Espero que cualquier curso decente de Ciencias de la Computación cubra esto en la(s) clase(s) de organización de la Computación.

    –Josh Glover

    26 de diciembre de 2009 a las 6:45

  • @Roddy: los bytes de 6 bits en realidad no están permitidos en C o C ++: la cantidad mínima de bits en un byte (que C / C ++ define como sizeof(char)) es 8.

    –David Piedra

    25/10/2013 a las 17:43

  • @DavidStone en realidad sizeof(char) se define como 1. A lo que te quieres referir es CHAR_BIT en lugar de.

    – Ruslán

    21 de julio de 2017 a las 9:14

  • @Ruslan: Lo siento, lo que escribí fue ambiguo. Estaba tratando de decir que C y C++ definen un byte como sizeof(char)y el número mínimo de bits en eso es 8.

    –David Piedra

    21 de julio de 2017 a las 13:01

La CDC Cyber ​​18 que usé en los años 80 era una máquina de complemento de 1, pero eso fue hace casi 30 años y no he visto ninguna desde entonces (sin embargo, también fue la última vez que trabajé en una computadora que no era una PC)

RFC 791 p.14 define la suma de comprobación del encabezado IP como:

El campo de suma de control es el complemento a uno de 16 bits de la suma del complemento a uno de todas las palabras de 16 bits en el encabezado. A efectos de calcular la suma de comprobación, el valor del campo de suma de comprobación es cero.

Así que el complemento de uno sigue siendo fuertemente se utiliza en el mundo real, en cada paquete IP que se envía. 🙂

Nunca me he encontrado con un sistema de complemento a uno, y he estado programando tanto tiempo como tú.

Pero encontré un sistema de complemento a 9, el lenguaje de máquina de una calculadora HP-41c. Admito que esto puede considerarse obsoleto, y no creo que hayan tenido nunca un compilador de C para eso.

Decidí buscar uno. Los sistemas Unisys ClearPath tienen un ANSI Compilador C (sí, lo llaman “American National Standard C” para el cual incluso la documentación en PDF se actualizó por última vez en 2013. La documentación está disponible en línea;

Allí, todos los tipos con signo utilizan la representación de complemento a uno, con las siguientes propiedades:

Type                 | Bits | Range
---------------------+------+-----------------
signed char          |   9  |  -2⁸+1 ...  2⁸-1
signed short         |  18  | -2¹⁷+1 ... 2¹⁷-1
signed int           |  36  | -2³⁵+1 ... 2³⁵-1
signed long int      |  36  | -2³⁵+1 ... 2³⁵-1
signed long long int |  72  | -2⁷¹+1 ... 2⁷¹-1

Sorprendentemente, también admite de forma predeterminada no conforme unsigned int y unsigned longque van desde 0 ... 2³⁶ - 2pero se puede cambiar a 0 ... 2³⁶ - 1 con un pragma.

Salimos de nuestra última década de 1960 caja de miel en algún momento del año pasado, lo que la convirtió en nuestra máquina más antigua en el sitio. Era el complemento de dos. Esto no quiere decir que saber o ser consciente del complemento de uno sea algo malo. Simplemente, probablemente nunca se encontrará con problemas de complemento hoy, sin importar cuánta arqueología informática le hagan hacer en el trabajo.

Los problemas con los que es más probable que te encuentres en el lado entero son endiano problemas (te estoy mirando PPD). Además, se encontrará con más problemas del “mundo real” (es decir, hoy) con flotante punto formatos de lo que será formatos enteros.

  • ¡Estuve en un sitio hace unas semanas que todavía tenía algunos honeyboxen en ejecución! Me sorprendió bastante ver que la máquina se encendía.

    – McPherrinM

    26 de diciembre de 2009 a las 6:52

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad