ConstStar
发布于 2024-11-29 / 3 阅读 / 0 评论 / 0 点赞

移位运算符陷阱

int main() {

    /* 符号位 和 左移运算符的类型提升 */
    int8_t val1 = 0x10;
    int8_t val2 = 0x84;
    uint16_t val3 = (val1 << 8) | val2;
    uint16_t val4 = (val1 << 8) + val2;
    printf("%x %x\r\n", val3, val4); // ff84 f84

    /* 位运算判断细节(具体得看编译器行为) */
    uint8_t a = 0xFF;
    bool result1 = ((a + 1) == (1 << 8)); // 不建议使用
    bool result2 = a == ((1 << 8) - 1); // 建议使用
    printf("%d %d\r\n",result1 ,result2); // 1 1

    /* 位移操作数的位数限制(具体得看编译器行为) */
    uint32_t c = 1;
    uint32_t result3 = 1 << 32;
    uint32_t result4 = c << 32;
    printf("%x %x\r\n",result3, result4); // 0 1

    return 0;
}

评论