我的代码的目的是在我的int(32位)表示的右侧创建n个零的掩码。我的方法是首先将负数存储在一个变量中,然后将其左移n个空格,以便右边有n个零。代码如下:为什么我在左移位的不同实现中有这种不同的行为?
int mask(int n){
int neg1=(1<<31)>>31;
int mask=neg1<<n;
return mask;
}
然而当n为32,我想获得价值为0x0,而是我得到的0xffffffff(NEG1)。当我切换到变量时会发生这种情况。但是,当我转向常数本身时,它就像一种魅力。新代码是:
mask=0xffffffff<<n;
尽管如此,我不允许使用多于8位的常量。所以我需要存储在另一个变量中的值。有人可以告诉我为什么会发生这种情况,我该如何解决?
非常感谢!
你正在试图做的换挡是未定义的行为。另外,为什么你要做'(1 <<31)>> 31'(也是未定义的行为)来获得'-1'? – user2357112
注意:左移入符号位是UB。“实现定义的行为的一个例子是如果一个有符号整数右移,就会出现高位“so'int neg1 =(1 <<31)>> 31;'可能无法按预期执行 – chux
必须使用'int'吗?'unsigned'如何? – chux