2015-08-10 16 views
5

In un RISC-V a 128 bit (o altra macchina a 128 bit), quanto sono grandi i tipi di dati "lunghi" e "lunghi" in C/C++?Dimensioni di "long long" nella macchina a 128 bit?

Per chiarire: quali sono le dimensioni che un implementatore di un compilatore potrebbe utilizzare durante la scrittura del file limits.h per tale macchina, in assenza di altre implementazioni a cui conformarsi?

risposta

8

Possono essere qualsiasi dimensione scrittore compilatore voluto, soggetta ad essi essendo almeno grande quanto il loro tipo predecessore (long int per long long int e int per long int) e soddisfare gli intervalli minimi stabiliti dalle norme.

Vedi, per esempio, 5.2.4.2 Numerical limits in C11, in cui si afferma la gamma minima richiesta:

long int 
    LONG_MIN   -2147483647 // −(2^31 − 1) 
    LONG_MAX   +2147483647 // 2^31 − 1 
long long int 
    LLONG_MIN -9223372036854775807 // −(2^63 − 1) 
    LLONG_MAX +9223372036854775807 // 2^63 − 1 

Si noti che questi non sono la vostra gamma completa complemento due di quanto devono tenere conto per l'altro anche due schemi di codifica, il complemento e la grandezza del segno, entrambi con il concetto di zero negativo.

Se si vuole veramente sapere, si può solo guardare quei valori nel file limits.h intestazione, o compilare ed eseguire:

#include <stdio.h> 
#include <limits.h> 

int main (void) { 
    printf ("BITS/CHAR %d\n", CHAR_BIT); 
    printf ("CHARS/SHORT %d\n", sizeof(short)); 
    printf ("CHARS/INT %d\n", sizeof(int)); 
    printf ("CHARS/LONG %d\n", sizeof(long)); 
    printf ("CHARS/LLONG %d\n", sizeof(long long)); 
    putchar ('\n'); 

    printf ("SHORT MIN %d\n", SHRT_MIN); 
    printf ("SHORT MAX %d\n", SHRT_MAX); 
    printf ("INT MIN %d\n", INT_MIN); 
    printf ("INT MAX %d\n", INT_MAX); 
    printf ("LONG MIN %ld\n", LONG_MIN); 
    printf ("LONG MAX %ld\n", LONG_MAX); 
    printf ("LLONG MIN %lld\n", LLONG_MIN); 
    printf ("LLONG MAX %lld\n", LLONG_MAX); 
    return 0; 
} 

Sul mio sistema, uno abbastanza bog-standard (e un po 'riformattato a guardare piuttosto):

BITS/CHAR  8 
CHARS/SHORT 2 
CHARS/INT  4 
CHARS/LONG  4 
CHARS/LLONG 8 

SHORT MIN     -32768 
SHORT MAX     32767 
INT MIN    -2147483648 
INT MAX    2147483647 
LONG MIN    -2147483648 
LONG MAX    2147483647 
LLONG MIN -9223372036854775808 
LLONG MAX 9223372036854775807 

Quindi sembra che, su questo sistema, ho complemento a due (il 8/7 disadattamento sul l'ultima cifra dei numeri negativi/positivi), nessun bit di imbottitura, a 16 bit short int, 32 -bit int e long int e 64-bit long long int.

Se si esegue un codice simile nel proprio ambiente, dovrebbe essere in grado di fornirvi informazioni simili.

+2

C'è un secondo vincolo sulla dimensione di 'long long': deve essere di almeno 64 bit. Questo è garantito dallo standard C. – cmaster

+1

@ cmaster: in realtà, la frase "64 bit" è vista solo tre volte in C11, due volte in relazione al formato a virgola mobile IEC 60559 e una volta per i tipi di interi a larghezza esatta. Non viene menzionato affatto per i normali tipi interi sebbene sia possibile estrapolare gli intervalli (che * sono * specificati) per assumere 64 bit richiesti. Ma sono gli * intervalli * che sono specificati specificamente piuttosto che la larghezza. Certo, potrei sbagliarmi, non sarebbe la prima volta. Ma avrei bisogno di una citazione dello standard per convincermi :-) – paxdiablo

+1

@paxdiablo: Il C11 definisce _bit_ in §3.5 come unità, che è abbastanza grande da contenere due valori. Cita anche il termine _mathematically defined_ in §6.5/p5. Con la matematica pura, è possibile memorizzare esattamente i valori unici '2^n' nell'entità' n'-bit, L'intervallo _minimum_ di 'long long int' implica 'abs (LLONG_MIN) + LLONG_MAX + 1' valori univoci (extra uno per zero). Il risultato di 'ceil (log2 (abs (LLONG_MIN) + LLONG_MAX + 1))' è 64, quindi è la _minimum_ width in bit per quel tipo. Si noti che questo non è necessariamente necessario otto byte, poiché 'CHAR_BIT' è definito dall'implementazione e può essere diverso da otto. –

-1

Secondo la norma, i tipi interi firmati non numerici denominati sono:

Type name  Possible size 
signed char — 8 
short   — 16 
int   — 32 
long   — 64 
long long  — 128 
intmax_t  — 256 

(By 'non numerico', voglio dire, ignorando int_least8_t, int_fast16_t e int32_t, ecc)

Le dimensioni elencate non sono quelle imposte dallo standard C, ma sono una progressione standard con il doppio di bit in ogni tipo successivo. Su una macchina a 128 bit, sarebbe ragionevole supporre che long long sia lungo 128 bit. Se lo scrittore del compilatore volesse supportare i tipi a 256 bit, non sarebbe stravagante rendere intmax_t in un tipo a 256-bit. Ma oltre a questo, hai finito i nomi. Normalmente, alcuni di questi tipi condividono le stesse dimensioni.

Tutta la norma richiede è il nessun tipo precedenza nella lista è più di un tipo più tardi nella lista, che char è almeno 8 bit, che short e int sono almeno 16 bit, che long è almeno 32 bit, e che long long è di almeno 64 bit.

+1

Dove hai visto che il long lungo è 128bit nello standard? Posso solo scoprire che è almeno a 64 bit. – galinette

+0

@galinette: lo standard dice solo "minimo 64 bit". L'esempio a 128 bit proviene da un ipotetico tipo di CPU a 128 bit. –

0

Includere l'intestazione limits.h e stampare la dimensione del tipo desiderato.

#include <limits.h> 

int main() { 

printf ("Size of long long is : %d\n", sizeof(long long)); 

return 0; 
}