相关疑难解决方法(0)

int的大小是否取决于编译器和/或处理器?

整数的大小是否取决于编译器,操作系统和处理器?

c c++ types

69
推荐指数
4
解决办法
4万
查看次数

应用按位运算符"〜"后,从"int"转换为"unsigned short"

我使用的静态分析工具会对此代码提出警告:

uint16 var1 = 1U;
uint16 var2 = ~var1;
Run Code Online (Sandbox Code Playgroud)

我检查了MISRA C 2004规则,我发现10.5规则:

如果按位运算符〜和<<应用于基础类型unsigned charunsigned 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. 是否有从signed intunsigned short unspecified行为的显式转换?
  2. 如果是,如何以安全的方式使用带有unsigned short的补码运算符?

c casting

12
推荐指数
2
解决办法
7948
查看次数

我真的不知道为什么位移位在一种情况下有效,但在另一种情况下不起作用

所以我正在做一些位移,我遇到了以下问题,我将非常感激得到答案:

作为参数,我可以传递 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)

c bit-shift

3
推荐指数
1
解决办法
124
查看次数

标签 统计

c ×3

bit-shift ×1

c++ ×1

casting ×1

types ×1