¿El complemento es un problema del mundo real o simplemente histórico?

Otra pregunta sobre la determinación de impar / uniformidad en C, y el enfoque idiomático (x & 1) se marcó correctamente como roto para los sistemas basados ​​en el complemento , que el estándar C permite.

¿Los sistemas realmente existen en el “mundo real” fuera de los museos informáticos? He estado progtwigndo desde la década de 1970 y estoy bastante seguro de que nunca me he encontrado con una bestia así.

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

Todo se reduce a conocer tus raíces.
Sí, técnicamente esta es una técnica antigua y probablemente haría lo que otras personas sugirieron en esa pregunta y usaré el operador módulo (%) para determinar impar o par. Pero comprender qué complemento a 1 (o complemento a 2) siempre es bueno saber. Ya sea que los uses o no, tu CPU está lidiando con esas cosas todo el tiempo. Entonces nunca puede doler entender el concepto. Ahora, los sistemas modernos lo hacen para que nunca tenga que preocuparse por cosas así, por lo que se ha convertido en un tema para la Progtwigción de 101 cursos en cierto modo. Pero debes recordar que algunas personas todavía usarían esto en el “mundo real” … por ejemplo, contrariamente a la creencia popular, ¡hay personas que todavía usan el ensamblaje! No muchos, pero hasta que las CPU puedan entender C # sin procesar y Java, alguien todavía tendrá que entender esto.

Y diablos, nunca se sabe cuándo podría encontrarse a uno mismo haciendo algo donde realmente necesita realizar operaciones binarias y ese complemento podría ser útil.

Trabajo en el campo de la telemetría y algunos de nuestros clientes tienen convertidores análogos a digitales que todavía usan el complemento de 1. Tuve que escribir el código el otro día para convertir el complemento 1 al complemento 2 para compensar.

Así que sí, todavía está por ahí (pero no te vas a encontrar con eso muy a menudo).

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

El campo de sum de comprobación es el complemento de 16 bits de la sum del complemento de una de las palabras de 16 bits en el encabezado. Para calcular la sum de comprobación, el valor del campo de sum de comprobación es cero.

Así que el complemento de uno todavía se usa mucho en el mundo real, en cada paquete IP que se envía. 🙂

El CDC Cyber ​​18 que utilicé en el ’80 era una máquina complementaria 1s, pero eso fue hace casi 30 años, y no he visto uno desde entonces (sin embargo, esa también fue la última vez que trabajé en un PC que no es de PC)

Nunca me he encontrado con un sistema complementario, y he estado codificando todo el tiempo que tienes.

Pero encontré un sistema de complemento de 9: el lenguaje de máquina de una calculadora HP-41c. Admitiré que esto puede considerarse obsoleto, y no creo que alguna vez hayan tenido un comstackdor de C para ellos.

Nos bajamos de nuestros Honeyboxen de la última década del año pasado, lo que la convirtió en nuestra máquina más antigua en el lugar. Fue complemento de dos. Esto no quiere decir que saber o ser consciente del complemento de uno sea algo malo. Simplemente, probablemente nunca te topes con los problemas de complemento de uno hoy, sin importar cuánta arqueología informática tengan en el trabajo.

Los problemas con los que es más probable que se encuentre en el lado entero son los problemas endian (estoy viendo su PDP ). Además, se encontrará con más problemas del “mundo real” (es decir, hoy en día) con los formatos de punto flotante que con los formatos enteros.

Lo curioso es que la gente hizo esa misma pregunta en comp.std.c en 1993 , y nadie podía apuntar a la máquina complementaria que se había usado en ese momento .

Entonces, sí, creo que podemos decir con confianza que el complemento de uno pertenece a un rincón oscuro de nuestra historia, prácticamente muerto, y ya no es una preocupación.

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

Allí, los tipos firmados utilizan la representación complementaria de 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 manera predeterminada, no unsigned int y unsigned long , que van desde 0 ... 2³⁶ - 2 , pero pueden cambiarse a 0 ... 2³⁶ - 1 con pragma.

¿El complemento es un problema del mundo real o simplemente histórico?

Sí, todavía se usa. Incluso se usa en los modernos procesadores Intel. De Intel® 64 y IA-32 Architectures Software Developer’s Manual 2A, página 3-8:

3.1.1.8 Sección de descripción

Cada instrucción se describe luego por número de secciones de información. La sección “Descripción” describe el propósito de las instrucciones y operandos necesarios en más detalle.

Resumen de términos que pueden usarse en la sección de descripción:
* SSE heredado: se refiere a SSE, SSE2, SSE3, SSSE3, SSE4, AESNI, PCLMULQDQ y a cualquier conjunto de instrucciones futuras que haga referencia a los registros XMM y codificados sin un prefijo VEX.
* VEX.vvvv. El campo de bits VEX que especifica un registro de origen o de destino (en forma de complemento de 1).
* rm_field: abreviatura para el campo ModR / M r / m y cualquier REX.B
* reg_field: abreviatura para el campo reg ModR / M y cualquier REX.R