2015-08-06 25 views
6

Looking at this answer e sapendo che 0 is an octal constant:Does size_t foo = 0; hai bisogno di un cast?

Per esadecimale [costanti [e ottale in base ai commenti]], è il primo tipo il valore può andare bene in: int, unsigned int, long, unsigned long, long long , unsigned long long

Pertanto, io deduco questo non ha bisogno di un cast:

size_t foo = 0; 

Tuttavia, a causa di un severo strumento MISRA-C, restituisco un messaggio su una conversione di tipo implicito illegale - MISRA-C: 2004 Rule 10.1.

La mia comprensione è errata oppure lo strumento è in errore?

(NB:. Ho cambiato a size_t foo = 0U; come che è molto più semplice di discutere con QA, ma mi piacerebbe soddisfare la mia curiosità)

+0

Come si definisce "bisogno di un cast"? C'è una conversione implicita e MISRA te ne parla. – juanchopanza

+1

Inoltre, dal momento che hai taggato la domanda C, e non C++, ecco [una domanda sul fatto che '0 'è ottale in C] (http://stackoverflow.com/questions/26625311/is-0-an-otale-or- un decimale-in-c /). – juanchopanza

+7

Una costante decimale non avrebbe bisogno di un cast neanche; qualsiasi tipo aritmetico può essere implicitamente convertito in qualsiasi altro tipo aritmetico. Ma 'size_t foo = 0U;' può anche implicare una conversione implicita; '0U' è di tipo' unsigned int', che può o meno essere dello stesso tipo di 'size_t'. (E se MISRA richiede un cast, MISRA è stupido.) –

risposta

3

io non sono sicuro di quello che si sta cercando di raggiungere, ma ...

  • 0 è di tipo int firmato
  • 0U è di tipo unsigned int

size_t richiede digitare size_t - e le dimensioni sono (di solito) non firmato

Così, per il rigoroso rispetto size_t foo = 0U; anche se potrebbe essere più corretto utilizzare size_t foo = (size_t)0;

Per inciso, discussione se 0 è decimale, ottale o qualsiasi altra cosa è irrilevante. .. è ancora zero.

-

Modifica per aggiungere:

Anche se la conversione esplicita tra firmato e non firmato è stata sconsigliata a MISRA C: 2004 (anche se questo era ampiamente deviato), per MISRA C: 2012 Regola 10.3 permette esplicitamente un'espressione di costante intera non negativa di tipo essenzialmente firmato può essere assegnata a un oggetto di tipo essenzialmente non firmato se il suo valore può essere rappresentato da quel tipo

Questo è un modo standard per dire che non è necessario il U