左位移C在没有扩展名的情况下

时间:2013-04-21 03:51:36

标签: c

我想知道当我向左移位时,如何让C不扩展我的二进制数

int main ()
{
    unsigned int binary_temp = 0b0100;
    binary_temp = binary_temp << 2;
    printf("%d", binary_temp);
    return 0;
}

当我运行时,我希望返回值为0,因为它已超过我所拥有的4位数,但现在它返回16(10000)。我如何让C不延长我的号码?

编辑:我希望能够以二进制形式处理数字,所以我只需要4位数,而不只是输出正确的数字。

3 个答案:

答案 0 :(得分:9)

它不会扩展您的数字,而是将其保存为unsigned int类型,其大小为4个字节(32位)。您只填写最后4位。要将其视为仅4位,请使用按位AND和掩码值。这是示例代码:

int main()
{
    unsigned int binary_temp = 0b0100;
    binary_temp = (binary_temp << 2) & 0b1111;
    printf("%u", binary_temp);
    return 0;
}

答案 1 :(得分:4)

您可以使用4位掩码值按位AND结果:

binary_temp = (binary_temp << 2) & 0xF;

答案 2 :(得分:0)

标准C中没有0b。您可以使用4

unsigned int /* prepare for wtf identifier: */
             binary_temp = 4;

左移2乘以4.为什么不呢?

binary_temp *= 4;

...然后减少modulo 16?

binary_temp %= 16;

在这种情况下,使用二元运算符有什么意义?我没有看到。

%d指令对应int参数,但您提供的参数printfunsigned int。这是未定义的行为。

printf("%u", binary_temp);

我确信您正在阅读的任何一本书都会告诉您%u指令。