2013-04-01 6 views
22

In base a this, i valori letterali interi senza suffisso di tipo sono sempre int s. Tuttavia, sia gcc che clang interpretano 0xffffffff (o qualsiasi letterale che imposta esplicitamente il bit di segno diverso dall'utilizzo di -) come non firmato. Che è corretto? (Secondo this compilatori sono)È il letterale 0xffffffff int o non firmato in C++

+0

Non so, ma sono interessato a sapere perché è importante. –

+0

@roger_rowland non lo fa, presumibilmente, ma clang mi avverte di una conversione da unsigned a signed, che è fastidioso e che non ho capito – Walter

+0

Suppongo che il punto sia 0xffffffff = 4294967295 sono numeri positivi e non si adattano in un Int. –

risposta

25

Per Paragrafo 2.14.2/2 del C++ 11 standard,

Il tipo di un intero letterale è il primo della lista corrispondente nella tabella 6 il cui valore può essere rappresentato da .

Tabella 6 rapporti che per le costanti esadecimali, il tipo dovrebbe essere:

  • int; oppure (se non adatto)
  • unsigned int; oppure (se non adatto)
  • long int; oppure (se non adatto)
  • unsigned long int; o (se non si adatta)
  • long long int; oppure
  • unsigned long long int.

Assumendo che l'attuazione è a 32 bit int, dal momento che 0xffffffff non rientra in un int, il tipo dovrebbe essere unsigned int. Per un'implementazione con un int a 64 bit, il tipo sarà int.

avviso, che se avessi scritto la stessa letterale come decimali costante, invece, il tipo avrebbe potuto essere solo:

  • int; oppure (se non adatto)
  • long int; o (se non si adatta)
  • long long int.
+0

Interessante. Vuoi collegare la citazione alla sua pagina web online, se è possibile? – deepmax

+7

@MM .: Questo è lo standard C++ 11 (sto usando il Draft 3485, che è leggermente più recente dello Standard ufficiale). The Draft può essere scaricato gratuitamente da [qui] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2012/n3485.pdf). Lo standard ufficiale è pagato. –

Problemi correlati