c语言中 unsigned int 类型数~0,如何左移为 0
在左移次数大于或等于类型宽度时,左移的次数变为:次数%类型宽度。所以11111111111111111111111111111111左移31位是:100000000000...
在左移次数大于或等于类型宽度时,左移的次数变为:次数%类型宽度。
所以
1111 1111 1111 1111 1111 1111 1111 1111 左移31位是:
1000 0000 0000 0000 0000 0000 0000 0000
左移32位相当于,不移动(32%32 == 0),还是:
1111 1111 1111 1111 1111 1111 1111 1111
那么如果要移成:
0000 0000 0000 0000 0000 0000 0000 0000
如何移动啊? 展开
所以
1111 1111 1111 1111 1111 1111 1111 1111 左移31位是:
1000 0000 0000 0000 0000 0000 0000 0000
左移32位相当于,不移动(32%32 == 0),还是:
1111 1111 1111 1111 1111 1111 1111 1111
那么如果要移成:
0000 0000 0000 0000 0000 0000 0000 0000
如何移动啊? 展开
2个回答
展开全部
unsigned int 左移32位相当于不移动。
移位运算,要求移位结果至少保留一位原来的数字,也就是说 32 位,最多左移或右移31位,超出31位 得到的数据 是无意义的。
0xffffffff 左移31位是 0x80000000.
没有办法移动成 32位 全0。(除非使用的编译器另有规定)。
-----------------------------
unsigned int a=0xffffffff;
printf("%#x %#x %#x %#x\n",a,a<<31,a<<32, a>>32 );
MS VC++ 6.0 输出 是:
0xffffffff 0x80000000 0xffffffff 0xffffffff
移位运算,要求移位结果至少保留一位原来的数字,也就是说 32 位,最多左移或右移31位,超出31位 得到的数据 是无意义的。
0xffffffff 左移31位是 0x80000000.
没有办法移动成 32位 全0。(除非使用的编译器另有规定)。
-----------------------------
unsigned int a=0xffffffff;
printf("%#x %#x %#x %#x\n",a,a<<31,a<<32, a>>32 );
MS VC++ 6.0 输出 是:
0xffffffff 0x80000000 0xffffffff 0xffffffff
展开全部
上一种描述是正确的
如
unsigned int i=1;
i<<1 0000 0000 0000 0010
i<<2 0000 0000 0000 0100
i<<7 0000 0000 1000 0000
i<<15 1000 0000 0000 0000
i<<16 0000 0000 0000 0000
i<<17 0000 0000 0000 0000
如
unsigned int i=1;
i<<1 0000 0000 0000 0010
i<<2 0000 0000 0000 0100
i<<7 0000 0000 1000 0000
i<<15 1000 0000 0000 0000
i<<16 0000 0000 0000 0000
i<<17 0000 0000 0000 0000
追问
你好,在我的机器上,
左移16位会变成0000 0000 0000 0001
左移17位会变成0000 0000 0000 0010
好像,编译器会重新计算左移次数
追答
与不同的编译器相关,我的是不会计算的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询