Domanda

Un'altra domanda posta sulla determinazione di dispari / uniformità in C e l'approccio idiomatico (x & amp; 1) è stato correttamente contrassegnato come rotto per sistemi basati su un complemento , che lo standard C consente.

Esistono davvero dei sistemi nel "mondo reale" al di fuori dei musei dei computer? Ho programmato dagli anni '70 e sono abbastanza sicuro di non aver mai incontrato una tale bestia.

Qualcuno sta davvero sviluppando o testando il codice per un tale sistema? E, in caso contrario, dovremmo preoccuparci di tali cose o inserirle nella Room 101 insieme a nastro di carta e schede perforate ...?

È stato utile?

Soluzione

Tutto questo si riduce alla conoscenza delle tue radici.
Sì, questa è tecnicamente una vecchia tecnica e probabilmente farei ciò che gli altri hanno suggerito in quella domanda e utilizzare l'operatore modulo (%) per determinare pari o dispari. Ma capire cosa è un complemento 1s (o complemento 2s) è sempre una buona cosa da sapere. Indipendentemente dal fatto che tu li usi o meno, la tua CPU ha sempre a che fare con queste cose. Quindi non può mai far male capire il concetto. Ora, i sistemi moderni lo fanno in modo da non doversi mai preoccupare di cose del genere, quindi è diventato un argomento per la programmazione dei corsi 101 in un certo senso. Ma devi ricordare che alcune persone lo userebbero ancora nel "mondo reale" ... per esempio, contrariamente alla credenza popolare ci sono persone che usano ancora il montaggio! Non molte, ma fino a quando Le CPU possono capire C # e Java grezzi, qualcuno dovrà ancora capire queste cose.

E diamine, non sai mai quando potresti trovarti a fare qualcosa in cui devi effettivamente eseguire la matematica binaria e che il complemento a 1 potrebbe tornare utile.

Altri suggerimenti

Lavoro nel campo della telemetria e alcuni dei nostri clienti hanno vecchi convertitori da analogico a digitale che usano ancora il complemento di 1. Ho dovuto scrivere il codice l'altro giorno per convertire dal complemento di 1 al complemento di 2 per compensare.

Quindi sì, è ancora là fuori (ma non ci si imbatte molto spesso).

RFC 791 p.14 definisce il checksum dell'intestazione IP come:

  

Il campo di checksum è il complemento di uno a 16 bit della somma del complemento di uno di tutte le parole a 16 bit nell'intestazione. Ai fini del calcolo del checksum, il valore del campo checksum è zero.

Quindi il proprio complemento è ancora pesantemente utilizzato nel mondo reale, in ogni singolo pacchetto IP che viene inviato. :)

Il CDC Cyber ??18 che ho usato negli anni '80 era un complemento 1s, ma è quasi 30 anni fa, e non ne ho visto uno da allora (tuttavia, è stata anche l'ultima volta che ho lavorato su un non- PC)

Non ho mai incontrato il sistema di complemento di una persona e sto programmando da quanto tempo.

Ma ho riscontrato un sistema di complementi a 9: il linguaggio macchina di una calcolatrice HP-41c. Devo ammettere che questo può essere considerato obsoleto e non credo che abbiano mai avuto un compilatore C per quelli.

Siamo scesi dai nostri ultimi anni '60 Honeyboxen l'anno scorso, che lo hanno reso la nostra macchina più vecchia posto. Era il complemento a due. Questo non vuol dire che conoscere o essere consapevoli del proprio complemento sia una cosa negativa. Solo, probabilmente non ti imbatterai mai in problemi di complemento oggi, non importa quanto archeologia informatica ti facciano al lavoro.

I problemi che è più probabile che si verifichino sul lato intero sono endian (I ti sto guardando PDP ). Inoltre, ti imbatterai in più "mondo reale" (cioè oggi) problemi con floating point formati di te sarà numeri interi.

Cosa divertente, la gente ha posto la stessa domanda su comp.std.c nel 1993 e nessuno poteva indicare la macchina di un complemento che era stata usata allora .

Quindi sì, penso che possiamo dire con sicurezza che il proprio complemento appartiene a un angolo oscuro della nostra storia, praticamente morto, e non è più un problema.

Ho deciso di trovarne uno. I sistemi Unisys ClearPath hanno un compilatore C ANSI (sì, lo chiamano " American National Standard C " per il quale anche la documentazione PDF è stata aggiornata l'ultima volta nel 2013. La documentazione è disponibile online ;

Lì i tipi firmati utilizzano tutti la rappresentazione del complemento, con le seguenti proprietà:

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, supporta anche per impostazione predefinita unsigned int e unsigned long , che vanno da 0 ... 2 & # 179; & # 8310 ; - 2 , ma può essere modificato in 0 ... 2 & # 179; & # 8310; - 1 con un pragma.

  

Il complemento è un problema del mondo reale, o solo storico?

Sì, ancora usato. È persino utilizzato nei moderni processori Intel. Da Intel & # 174; 64 and IA-32 Architectures Software Developer & # 8217; s Manual 2A, pagina 3-8:

  

3.1.1.8 Sezione descrittiva

     

Ogni istruzione è quindi descritta da un numero di sezioni di informazioni. & # 8220; Descrizione & # 8221; sezione descrive lo scopo delle istruzioni e gli operandi richiesti in modo più dettagliato.

     

Riepilogo dei termini che possono essere utilizzati nella sezione descrizione:
  * SSE legacy: si riferisce a SSE, SSE2, SSE3, SSSE3, SSE4, AESNI, PCLMULQDQ e qualsiasi set di istruzioni futuro che fa riferimento ai registri XMM e codificato senza un prefisso VEX.
  * VEX.vvvv. Il campo di bit VEX che specifica un registro di origine o di destinazione (nel modulo di complemento a 1 & # 8217;)   * rm_field: scorciatoia per il campo ModR / M r / m e qualsiasi REX.B
  * reg_field: scorciatoia per il campo reg ModR / M e qualsiasi REX.R

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top