6

查看这个答案并知道0 是一个八进制常数

对于十六进制[常量 [和八进制根据注释]],它是值可以适合的第一种类型:int, unsigned int, long, unsigned long, long long,unsigned long long

因此,我推断这不需要演员表:

size_t foo = 0;

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

是我的理解有误,还是工具有误?

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

4

1 回答 1

3

我不确定您要达到的目标,但是...

  • 0 是带符号的 int 类型
  • 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 的标准方式

于 2015-08-06T06:07:59.160 回答