Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does size_t foo = 0; need a cast?

Looking at this answer and knowing that 0 is an octal constant:

For hexadecimal [constants [and octal according to the comments]], it is the first type the value can fit in: int, unsigned int, long, unsigned long, long long, unsigned long long

Therefore, I deduce this does not need a cast:

size_t foo = 0;

However, due to a strict MISRA-C lint tool, I get back a message about an illegal implicit type conversion - MISRA-C:2004 Rule 10.1.

Is my understanding wrong, or is the tool in error?

(NB: I've changed to size_t foo = 0U; as that is a lot simpler than arguing with QA, but I'd like to satisfy my own curiosity.)

like image 952
Ken Y-N Avatar asked Aug 06 '15 05:08

Ken Y-N


1 Answers

I'm not sure what you are trying to achieve, but...

  • 0 is of type signed int
  • 0U is of type unsigned int

size_t requires type size_t - and sizes are (usually) unsigned

So for strict compliance size_t foo = 0U; although it might be more correct to use size_t foo = (size_t)0;

As an aside, discussion as to whether 0 is decimal, octal or anything else is irrelevant... it is still zero.

--

Edit to add:

Although explicit conversion between signed and unsigned was deprecated in MISRA C:2004 (although this was widely deviated), for MISRA C:2012 Rule 10.3 explicitly allows a non-negative integer constant expression of essentially signed type may be assigned to an object of essentially unsigned type if its value can be represented by that type

This is a standard-ese way of saying you don't need the U

like image 174
Andrew Avatar answered Oct 01 '22 14:10

Andrew