我正在尝试移动值为1111的变量'a'并将其移到左侧,这样我就可以得到1110,这意味着它应该打印数字14.然而,它是打印30.我在想因为它正在移动,但它不会占用最多的位(11110),但应该是1110.这是我的代码。谢谢。
int main(int argc, char *argv[]) {
unsigned a;
a=0xF;
a=a<<1;
printf(": %u\n",a);
答案 0 :(得分:8)
您的a
变量声明为unsigned
- 这意味着它是unsigned int
,通常有32位。因此,当您将0xF
放入其中时,它实际上包含0x0000000F
或
00000000000000000000000000001111
二进制。
当您将该位置向左移动时,它包含
00000000000000000000000000011110
或十进制30。 (0x1e,十六进制)
如果你想将它限制在4位,你需要在每次移位操作后用{0}结果AND
,比如
a = a << 1;
a = a & 0xF;
这将导致a
仅包含1110
(但实际上包含00000000000000000000000000001110
)
答案 1 :(得分:2)
首先,unsigned
是unsigned int
的缩写,在大多数现代系统中,int
被定义为4个字节(32位)。无论如何,它肯定超过4位。
你是对的&#34;它没有把最多的东西拿出去#34;。
如果您愿意,您可以按&
与0xF
进行匹配0
,将最后4位左侧的任何位设置为a = (a << 1) & 0xF;
。
{{1}}
答案 2 :(得分:1)
当您向左移动一个数字时,最左边的位不会被丢弃,它只会向左移动。因此,当您离开1111时,您将获得11110.为方便起见,您可以记住,无论何时左移一个数字,它乘以2,当您右移时,您实际上将它除以2.只会出现下降如果您指定的位类型用完该数字。在这种情况下,您将获得垃圾值作为答案。所以你的输出在你正在做的事情的背景下是正确的。但是如果你想从15获得14,我建议你使用减法。
答案 3 :(得分:0)
向左移动1111将导致11110,这确实是30.尝试阅读相关问题的这个非常好的答案,我认为你错误地认为了位移。 What are bitwise shift (bit-shift) operators and how do they work?