对于以下程序:
int main(void)
{
int value = 2;
int result = value >> 1U;
return result;
}
...夹板 3.1.2 给出警告:
splint_test.c: (in function main)
splint_test.c:4:18: Variable result initialized to type unsigned int, expects
int: value >> 1U
To ignore signs in type comparisons use +ignoresigns
Splint 似乎声称有符号整数右移的表达式具有无符号整数的类型。但是,我在 ANSI C90 标准中只能找到:
结果
E1 >> E2
是E1
右移的E2
位位置。如果E1
有无符号类型或E1
有符号类型和非负值,则结果的值是 的商E1
除以数量的整数部分,2 的幂E2
。
此代码的主要目标是具有主要 C90 编译器的嵌入式系统。但是,我对编写符合标准的代码很感兴趣。我一直在 C99 模式下对 GCC 和 Clang 进行测试,这样就restrict
可以了。
我的问题是:
- C 标准是否对位移结果的类型做出任何声明?
- 编译器吗?
- 如果不是,为什么 Splint 会发出此警告?