我使用的静态分析工具会对此代码提出警告:
uint16 var1 = 1U;
uint16 var2 = ~var1;
Run Code Online (Sandbox Code Playgroud)
我检查了MISRA C 2004规则,我发现10.5规则:
如果按位运算符〜和<<应用于基础类型unsigned char或unsigned short的操作数od ,则结果应立即转换为操作数的基础类型.
好吧,这不是问题,应用隐式强制转换(我认为"强制转换"意味着隐式或显式强制转换).但10.1规则说:
整数类型的表达式的值不应隐式转换为表达式复杂的不同基础类型.
先前的复杂操作示例是:~u16a
我将我的代码更改为:
uint16 var1 = 1U;
uint16 var2 = (uint16) ~var1;
Run Code Online (Sandbox Code Playgroud)
我得到另一个警告:我认为将int负值转换为unsigned int值是不安全的.我检查了C99标准(ISO C99)§6.3.1.3但我不明白是否明确指定了int转换为unsigned short.
在EmbeddedGurus文章中我读到:
c = (unsigned int) a; /* Since a is positive, this cast is safe */
Run Code Online (Sandbox Code Playgroud)
我的问题:
所以我正在做一些位移,我遇到了以下问题,我将非常感激得到答案:
作为参数,我可以传递 1 个字节的大小。
前 4 位代表分子。最后 4 位表示分母。
以下代码有效并给出正确的输出:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char** argv)
{
for(int i = 1; i < argc; i++)
{
unsigned char numerator = atoi(argv[i]);
numerator = (numerator >> 4);
numerator = (numerator << 4);
unsigned char denominator = atoi(argv[i]);
denominator = (denominator << 4);
denominator = (denominator >> 4);
printf("%d/%d\n", numerator, denominator);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我像这样替换位移部分,则分母给出与分子相同的输出:
unsigned char numerator = atoi(argv[i]);
numerator = (numerator >> 4) << …Run Code Online (Sandbox Code Playgroud)