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.)
I'm not sure what you are trying to achieve, but...
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With