size_t foo = 0;需要演员?

时间:2015-08-06 05:42:08

标签: c type-conversion misra

Looking at this answer并且知道0 is an octal constant

  

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

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

unsigned long long

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

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

(注意:我已经改为size_t foo = 0; 因为这比QA更简单,但我想满足自己的好奇心。)

1 个答案:

答案 0 :(得分:3)

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

  • 0的类型为signed 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