相关疑难解决方法(0)

如何在C中评估换档操作符?

当我使用shift进行操作时,我最近发现了一种(奇怪的)行为>> <<!

为了解释它,让我编写这个小的可运行代码,执行两个应该相同的操作(在我的理解中),但我对不同的结果感到惊讶!

#include <stdio.h>

int main(void) {
    unsigned char a=0x05, b=0x05;

    // first operation
    a = ((a<<7)>>7);

    // second operation
    b <<= 7;
    b >>= 7;

    printf("a=%X b=%X\n", a, b);
    return 0;
} 
Run Code Online (Sandbox Code Playgroud)

跑步时,a = 5b = 1.我希望它们都等于1!有人可以解释为什么我得到这样的结果?

PS:在我的环境中,大小unsigned char为1个字节

c bit-shift integer-promotion

24
推荐指数
3
解决办法
1918
查看次数

在C中使用带有位运算符的小整数

之前的问题相关,我无法理解MISRA C 2004的一些规则.

ISO C99 2007草案中,在6.5节§4中:

一些运算符(一元运算符〜,以及二元运算符<<,>>,&,^和|,统称为按位运算符)需要具有整数类型的操作数.这些运算符产生的值取决于整数的内部表示,并且具有已签名类型的实现定义和未定义方面.

好吧,使用带位运算符的有符号整数可能会产生未定义的行为(并没有任何意义).

一个好的解决方案是使用显式转换为更宽的无符号整数类型,以便绕过整数提升,然后不使用带符号运算符的有符号值(请参阅我之前问题的相关答案).

但是在MISRA C 2004中,可以使用带位运算符的小型无符号整数(例如规则10.5).为什么,如果整数提升导致使用带位运算符的带符号值?我想我不明白一些事情.

c misra type-promotion

10
推荐指数
1
解决办法
1125
查看次数

标签 统计

c ×2

bit-shift ×1

integer-promotion ×1

misra ×1

type-promotion ×1