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
- 1. Esistono implementazioni di interi interi solidi in C?
- 2. uso di piccoli numeri interi con operatore bit in C
- 3. Rappresentazione di numeri negativi in C?
- 4. Stringa di bit Erlang alla conversione di numeri interi
- 5. Esistono implementazioni Websocket C# decenti?
- 6. Stampa di numeri interi con {#} in C#?
- 7. Prestazioni di numeri interi a 32 bit in un ambiente a 64 bit (C++)
- 8. puntatore offset compatto, implementazioni esistenti?
- 9. C: Rappresentazione di Big Integers
- 10. rappresentazione bit di stampa di numeri in python
- 11. Imballaggio di bit di array di numeri interi
- 12. EDSAC - Numeri interi a 17 bit e 35 bit
- 13. Esistono implementazioni SPARQL filettate?
- 14. Esistono implementazioni comunemente utilizzate di IQueryable?
- 15. Esistono facciate di memorizzazione nella cache Java esistenti?
- 16. Numeri interi a larghezza fissa in C++
- 17. Esistono implementazioni di Sparse Matrix ottimizzate per l'archiviazione in C#?
- 18. C++ interi di lunghezza arbitrari
- 19. Riempimento di un DataFrame con i numeri di "segno"
- 20. Esistono implementazioni di multiset per .Net?
- 21. C'è un modo di vedere un numero nella sua float rappresentazione IEEE754 a 64 bit
- 22. Problemi nella conversione di Set di numeri interi nell'int [] array
- 23. Ottieni intervallo di numeri interi con linq
- 24. Numero di bit nei numeri di Javascript
- 25. Per la condizione del ciclo di fermarsi a 0 quando si utilizzano numeri interi non firmati?
- 26. Cross-over due interi bit a bit
- 27. Determinazione di numeri pari/dispari (numeri interi)?
- 28. Riempimento di un array con numeri in sequenza
- 29. Quanto è disastroso l'overflow dei numeri interi in C++?
- 30. numero di zeri nella rappresentazione binaria di un intero
È 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