2013-04-21 59 views
0

我想知道如何获得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位数字,而不是只输出正确的数字。

+7

请注意,二进制'0b0100'表示法是非标准(GNU)扩展。 – 2013-04-21 03:54:53

+0

你是什么意思“使用二进制形式的数字”? – GWW 2013-04-21 03:57:36

+0

@JonathanLeffler,你推荐什么标准来表示二进制文字? – 2013-04-21 04:03:17

回答

9

它不延伸你的电话号码,但将其保存为unsigned int类型,是大小为4个字节(32位)。您只填写最后4位。要将其仅视为4位,请使用按位与与掩码值。下面是示例代码:

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

谢谢,按预期工作 – user2303605 2013-04-21 04:33:18

4

可以按位AND的结果与一个4比特掩码值:

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

没有0b标准C.你可以使用4

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

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

binary_temp *= 4; 

...然后减少模16?

binary_temp %= 16; 

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

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

printf("%u", binary_temp); 

我相信哪一本书你正在读会告诉你关于%u指令。

+0

这个表示法可能是非标准的,但GCC和Clang中都有'0bXXXX'表示法,并且与手边的问题无关。 – 2013-04-21 05:31:22

+0

@ RichardJ.RossIII说到相关性:该问题多次提到C,但不是gcc或clang。 C由标准定义,而不是gcc或clang。在这个问题中没有提到这些实现中的任何一个。我认为指出违反约束是完全相关的,在这里... – Sebivor 2013-04-21 05:42:00

+0

在这里玩标准游戏几乎没有建设性,你不觉得吗? – 2013-04-21 05:59:40