2013-01-02 7 views
9

Come da C99, potrebbero forse essere presenti dei bit di riempimento nella rappresentazione signed int o unsigned int. Quindi mi chiedo se ci siano ancora implementazioni che hanno cose così antiquate?Esistono implementazioni C esistenti con bit di riempimento nella rappresentazione di numeri interi (un) firmati?

+0

È possibile produrre un esempio e sezioni correlate in standard C99 (la bozza più recente potrebbe essere OK) – ydroneaud

+0

@ydroneaud: vedere la sezione 6.2.6.2: "Per i tipi di interi senza segno diversi dal char senza segno, i bit dell'oggetto rappresentazione deve essere diviso in due gruppi: bit di valore e bit di riempimento ", analogamente per firmato. –

+0

@OliCharlesworth grazie – ydroneaud

risposta

9

Citando la logica C99 (PDF) sezione 6.2.6.2 § 20:

bit di riempimento sono accessibili dall'utente in un tipo intero senza segno. Ad esempio, supponiamo che una macchina utilizzi una coppia di cortocircuiti a 16 bit (ognuno con il proprio bit di segno) per creare un valore int a 32 bit e il bit di segno del short inferiore venga ignorato quando viene utilizzato in questo 32-bit int. Quindi, come signed int a 32 bit, c'è un bit di padding (nel mezzo dei 32 bit) che viene ignorato nel determinare il valore 20 del 3223 bit. Ma se questo elemento a 32 bit viene trattato come un 322 bit unsigned int, quel bit di riempimento è visibile al programma dell'utente. Al comitato C è stato detto che esiste una macchina che funziona in questo modo, e questo è uno dei motivi per cui i bit di riempimento sono stati aggiunti a C99.

Quindi queste cose almeno fatto esistono.

Come per le architetture bizzarre still around today, l'esempio di riferimento è la serie UNIVAC 1100/2200 con il suo weird data formats.

Mentre lo fa non uso imbottitura intero, uno sguardo al loro manuale compilatore C (PDF) è ancora istruttiva:

Table 4–4. Size and Range of Unsigned Integer Types 

Type     Size  Range 
unsigned short int 18 bits  0 to (2^18)–1 
unsigned short 

unsigned int   36 bits  0 to (2^36)–2 (see the following note) 
unsigned 

unsigned long int 36 bits  0 to (2^36)–2 (see the following note) 
unsigned long 

Il secondo volume (PDF) spiega come la parola CONFORMANCE/TWOSARITH compilatore può essere utilizzato per controllare l'interpretazione dello zero negativo: regola l'intervallo dei tipi interi senza segno rispetto al previsto (2^36) -1 ma viene fornito con una penalizzazione delle prestazioni su aritmetica non firmata.

+0

Una buona risposta con un buon esempio. – larmbr

+1

Assegnare 'unsigned int' un intervallo da 0 a 2^36-2 è in realtà non conforme. Se usa tutti i 36 bit di una parola a 36 bit come bit di valore, allora deve essere in grado di rappresentare tutti i 2^36 valori distinti. –

14

Da The New C Standard:

Su alcune Cray processori del tipo corto ha 32 bit di precisione ma si tiene a 64 bit del valore di stoccaggio. Il tipo intero senza segno di Unisys A Series contiene un bit di riempimento che viene considerato come un bit di segno nella rappresentazione di interi con segno.

...

Il computer Harris/6 rappresentato il tipo lungo utilizzando due tipi int consecutivi. Ciò significava che il bit di segno di uno degli inti doveva essere ignorato; è stato trattato come un bit di imbottitura. La rappresentazione del valore del tipo int è larga 24 bit e lunga ha una rappresentazione del valore di 47 bit con un bit di riempimento.

+1

+1: bello finalmente ottenere un nome per il '* macchina che funziona in questo modo *' – Christoph

3

Il MSP430X architettura (un'architettura per microcontrollori da Texas Instruments) è un architettura a 16 bit (MSP430) espanso ad uno spazio di indirizzi a 20 bit con 20 registri bit. L'architettura è ancora indirizzata al byte con un byte con otto bit. Le istruzioni possono generalmente operare su quantità di 8, 16 e 20 bit.

Su questa architettura, un compilatore potrebbe scegliere di rendere int un tipo a 20 bit. Dal momento che 20 non è un multiplo di 8, 4 o 12 bit di padding devono essere aggiunti quando si memorizza questo tipo in memoria.

+0

Bel esempio, grazie. Per inciso, la porta GCC per MSP430 (X) utilizza "puntatori 20 bit, dimensione_t 32-bit" (https://gcc.gnu.org/onlinedocs/gcc/MSP430-Options.html#MSP430-Options). – sleske

+0

@sleske Recentemente è stata eseguita una patch che aggiunge un 'uint20_t' a 20 bit e usa quel tipo per' size_t' e 'uintptr_t'. Non penso che ci sia stata comunque una versione stabile con quella patch. – fuz