Son complément est-il un problème du monde réel ou juste un problème historique?

Une autre question a été posée sur la détermination de l’équilibre / de l’équilibre dans C, et l’approche idiomatique (x & 1) a été correctement signalée comme interrompue pour ses systèmes basés sur le complément , ce que permet la norme C.

Les systèmes existent-ils vraiment dans le «monde réel» en dehors des musées de l’informatique? Je code depuis les années 1970 et je suis presque sûr de n’avoir jamais rencontré une telle bête.

Est-ce que quelqu’un est en train de développer ou de tester du code pour un tel système? Et si non, devrions-nous nous préoccuper de telles choses ou devrions-nous les mettre dans la salle 101 avec du ruban adhésif et des cartes perforées …?

Tout cela revient à connaître vos racines.
Oui, c’est techniquement une technique ancienne et je ferais probablement ce que les autres personnes ont suggéré dans cette question et utiliserais l’opérateur modulo (%) pour déterminer les valeurs impaires ou paires. Mais comprendre ce qu’est un complément à 1 (ou complément à 2) est toujours une bonne chose à savoir. Que vous les utilisiez ou non, votre processeur traite ces choses tout le temps. Donc, il ne peut jamais nuire à comprendre le concept. Maintenant, les systèmes modernes font en sorte que vous n’aurez généralement jamais à vous soucier de choses de ce genre. C’est donc devenu un sujet de programmation pour 101 cours. Mais il ne faut pas oublier que certaines personnes l’utilisent encore dans le “monde réel” … par exemple, contrairement à la croyance populaire, certaines personnes utilisent encore le assembly! Pas beaucoup, mais jusqu’à ce que les processeurs puissent comprendre C # brut et Java, il faudra toujours que quelqu’un comprenne ce genre de choses.

Et diable, vous ne savez jamais quand vous pourriez vous trouver en train de faire quelque chose pour lequel vous avez réellement besoin de faire des calculs binarys et que le complément peut être utile.

Je travaille dans le domaine de la télémésortinge et certains de nos clients ont d’anciens convertisseurs analogique-numérique qui utilisent toujours le complément à un. Il me suffisait d’écrire du code l’autre jour pour convertir du complément à 1 au complément à 2 afin de compenser.

Donc oui, c’est toujours là-bas (mais vous ne le rencontrerez pas très souvent).

La RFC 791 p.14 définit la sum de contrôle de l’en-tête IP comme suit:

Le champ de sum de contrôle est le complément à 16 bits de la sum de complément à tous les mots de 16 bits dans l’en-tête. Aux fins du calcul de la sum de contrôle, la valeur du champ de la sum de contrôle est zéro.

Le complément de chacun est donc encore très utilisé dans le monde réel, dans chaque paquet IP envoyé. 🙂

Le CDC Cyber ​​18 que j’avais utilisé dans les années 80 était une machine à complément à 1, mais cela fait près de 30 ans et je n’en ai pas vu depuis (mais c’était aussi la dernière fois que je travaillais sur un ordinateur autre que PC)

Je n’ai jamais rencontré de système de complément, et je code depuis toujours.

Mais j’ai rencontré un système complémentaire de 9, le langage machine d’une calculasortingce HP-41c. J’admets que cela peut être considéré comme obsolète, et je ne pense pas qu’ils aient jamais eu un compilateur C pour ceux-là.

Nous sums sortis de notre boîte aux lettres Honeyboxen des années 1960, l’année dernière, ce qui en a fait notre plus ancienne machine sur site. C’était un complément à deux. Cela ne veut pas dire que connaître ou être conscient de son complément est une mauvaise chose. Juste, vous ne rencontrerez probablement jamais vos problèmes de complément aujourd’hui, peu importe combien d’archéologie informatique vous avez au travail.

Les problèmes que vous êtes le plus susceptible de rencontrer du côté des entiers sont des problèmes finaux (je vous regarde PDP ). En outre, vous rencontrerez plus de problèmes du “monde réel” (c’est-à-dire d’aujourd’hui) avec les formats à virgule flottante que les formats entiers.

Chose amusante, les gens ont posé la même question sur comp.std.c en 1993 , et personne ne pouvait désigner la machine à complément utilisée à l’époque .

Alors oui, je pense que nous pouvons affirmer avec certitude que son complément appartient à un coin sombre de notre histoire, pratiquement mort, et n’est plus une préoccupation.

J’ai décidé d’en trouver un. Les systèmes Unisys ClearPath ont un compilateur ANSI C (oui, ils l’appellent “American National Standard C” pour laquelle même la documentation PDF a été mise à jour pour la dernière fois en 2013. Cette documentation est disponible en ligne ;

Les types signés utilisent tous la représentation du complément, avec les propriétés suivantes:

 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 

De manière remarquable, il prend également en charge par défaut unsigned int et unsigned long , qui vont de 0 ... 2³⁶ - 2 , mais peuvent être modifiés en 0 ... 2³⁶ - 1 avec un pragma.

Son complément est-il un problème du monde réel ou juste un problème historique?

Oui, il a encore utilisé. Il est même utilisé dans les processeurs Intel modernes. Extrait du Manuel du développeur de logiciels pour architectures Intel® 64 et IA-32 2A, page 3-8:

3.1.1.8 Section de description

Chaque instruction est ensuite décrite par le nombre de sections d’information. La section «Description» décrit l’object des instructions et des opérandes requirejs de manière plus détaillée.

Résumé des termes pouvant être utilisés dans la section description:
* SSE hérité: fait référence à SSE, SSE2, SSE3, SSSE3, SSE4, AESNI, PCLMULQDQ et à tous les futurs jeux d’instructions faisant référence à des registres XMM et codés sans préfixe VEX.
* VEX.vvvv. Le champ binary VEX spécifiant un registre source ou cible (sous forme de complément à 1).
* rm_field: raccourci pour le champ ModR / M r / m et tout REX.B
* reg_field: raccourci pour le champ modR / M reg et pour tout REX.R