size_t foo = 0;需要演员表吗?

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

因此,我推断这不需要转换:

size_t foo = 0;

但是,由于严格的 MISRA-C lint 工具,我收到一条关于非法隐式类型转换的消息 - MISRA-C:2004 规则 10.1。

是我理解错了,还是工具有误?

(注意:我已经改成了 size_t foo = 0U;,因为这比与 QA 争论要简单得多,但我想满足自己的好奇心。)

我不确定你想要达到什么目的,但是...

  • 0 是有符号整数类型
  • 0U 是 unsigned int 类型

size_t 需要类型 size_t - 并且大小(通常)是无符号的

所以为了严格遵守 size_t foo = 0U; 尽管使用 size_t foo = (size_t)0;

可能更正确

顺便说一句,关于 0 是十进制、八进制还是其他任何形式的讨论无关紧要...它仍然是零。

--

编辑添加:

虽然有符号和无符号之间的显式转换在 MISRA C:2004 中被弃用(尽管这有很大偏差),但对于 MISRA C:2012 规则 10.3 明确允许 非负整数本质上有符号类型的常量表达式可以分配给本质上无符号类型的对象,如果它的值可以用该类型表示

这是一种标准的表达方式,表示您不需要 U