Suffisso ULL su un valore letterale numerico

Ho incontrato un codice come questo:

line += addr & 0x3fULL; 

Ovviamente, ‘U’ e ‘L’ non sono cifre esadecimali. Immagino che l’ULL alla fine di quell’esagono letterale numerico significhi “Unsigned Long Long” – sono corretto? (questo genere di cose è molto difficile da google) se è così allora questa è una sorta di modificatore del suffisso sul numero?

Dal manuale di gcc :

ISO C99 supporta i tipi di dati per interi che hanno una larghezza minima di 64 bit e come estensione GCC li supporta in modalità C90 e in C ++. Basta scrivere long long int per un intero con unsigned long long int o unsigned long long int per un intero senza segno. Per rendere una costante intera di tipo long long int , aggiungi il suffisso LL all’intero. Per rendere una costante intera di tipo unsigned long long int , aggiungi l’ ULL del suffisso all’intero.

Sì, è corretto.

  • 0x prefisso 0x lo rende un valore letterale esadecimale.
  • ULL suffisso ULL lo rende di tipo unsigned long long .

Sto postulando una nuova risposta perché riconosco che le risposte attuali non citano da una fonte cross-platform. Lo standard C ++ 11 impone che un letterale con U / u e LL / ll suffissi sia un letterale di tipo: unsigned long long int [ source ]

U / u è il suffisso C / C ++ per un numero intero senza segno.
LL / ll è il suffisso C / C ++ per un intero long long che è un nuovo tipo in C ++ 11 e richiede una lunghezza almeno di 64 bit.

Gli appunti:

  1. La parola chiave int può essere omessa se vengono utilizzati modificatori, ad esempio unsigned long long . Quindi questo definirà one come unsigned long long int , e qualsiasi numero assegnato ad esso sarà static_cast a unsigned long long int : unsigned long long one = 1;
  2. C ++ 11 ha segnato l’avvento auto . Che imposta il tipo di variabile sul tipo assegnato ad esso sulla dichiarazione. Ad esempio, poiché 2ULL è un letterale unsigned long long int two sarà definito come unsigned long long int : auto two = 2ULL;
  3. C ++ 14 ha introdotto i suffissi letterali indipendenti dell’ordine. In precedenza il suffisso U / u doveva precedere qualsiasi suffisso di dimensione. Ma circa il C ++ 14 i suffissi sono accettati in entrambi gli ordini, quindi questo ora è un 13LLU letterale 13LLU unsigned long long int un legale unsigned long long int .