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?
risposta
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 delshort
inferiore venga ignorato quando viene utilizzato in questo 32-bitint
. Quindi, comesigned 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 bitunsigned 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.
Una buona risposta con un buon esempio. – larmbr
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. –
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: bello finalmente ottenere un nome per il '* macchina che funziona in questo modo *' – Christoph
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.
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
@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
È possibile produrre un esempio e sezioni correlate in standard C99 (la bozza più recente potrebbe essere OK) – ydroneaud
@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. –
@OliCharlesworth grazie – ydroneaud