C语言中的移位问题

Fangzhen 2012-08-02 09:36:12
如果对于一个无符号数x,如果将它所有的位右移移出的话,是不是应该为0阿?但是我在gcc下测试了一下,结果为0xffffffff
这是为什么阿?
...全文
213 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Evlix_Z 2012-08-03
  • 打赏
  • 举报
回复
VS2010测试。。

unsigned int a=0x1; //不论a的值是多少
a>>=32; //右移unsigned int位数之后..
printf("%x",a); //结果是本身...

坐等解释。。
wingzero520 2012-08-03
  • 打赏
  • 举报
回复
如果是有符号数的话,所有位都会变成符号位。原来是负数的将变成 -1(十六进制全是f) ,正数变成 0 。(十六进制全是0)
如果是无符号数,会变成 0 。
Fangzhen 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 4 楼 的回复:

VS2010测试。。
C/C++ code

unsigned int a=0x1; //不论a的值是多少
a>>=32; //右移unsigned int位数之后..
printf("%x",a); //结果是本身...


坐等解释。。

编译器会给出一个警告,说移位长度过长,行为未定义
我是进行再次16位移位进行的
[/Quote]
我在GCC下再次尝试了一下,也是给出类似的解释,然后给出的结果为a本身。
shift.c:4:5: warning: right shift count >= width of type

赵4老师 2012-08-03
  • 打赏
  • 举报
回复
#include <stdio.h>
unsigned short int ui;
signed short int si;
int main() {
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=ui>>1;
si=si>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);

printf("--------------\n");
ui=(unsigned short int)0x8000u;
si=( signed short int)0x8000;
printf("ui=%u\n",ui);
printf("si=%d\n",si);
ui=(( signed short int)ui)>>1;
si=((unsigned short int)si)>>1;
printf("ui=%u\n",ui);
printf("si=%d\n",si);

return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384
AnYidan 2012-08-03
  • 打赏
  • 举报
回复
Right shifting an unsigned quantity always fits the vacated bits with zero.

Right shifting a signed quantity will fill with bit signs (``arithmetic shift'') on some machines and with 0-bits (``logical shift'') on others.

如果 lz 程序没有错误,我只能说那是一个 “奇迹”

图灵狗 2012-08-03
  • 打赏
  • 举报
回复
有时由于编译器的原因,不允许移位过多,这时分几次就好,结果一定是0的:

#include <stdio.h>

int main(int argc, char* argv[])
{
unsigned int data = 0x00000001;

data >>= 16;
data >>= 16;
printf("%08x\n", data);

return 0;
}
Evlix_Z 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
编译器会给出一个警告,说移位长度过长,行为未定义
我是进行再次16位移位进行的
[/Quote]
额。。是么。。没有警告。。不过两次位移可行。
竞天问 2012-08-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

VS2010测试。。
C/C++ code

unsigned int a=0x1; //不论a的值是多少
a>>=32; //右移unsigned int位数之后..
printf("%x",a); //结果是本身...


坐等解释。。
[/Quote]
编译器会给出一个警告,说移位长度过长,行为未定义
我是进行再次16位移位进行的
竞天问 2012-08-02
  • 打赏
  • 举报
回复
全部移出去后就只剩下原数的符号位了
图灵狗 2012-08-02
  • 打赏
  • 举报
回复
当然是0,这里有个例子:

#include <stdio.h>

int main(int argc, char* argv[])
{
unsigned char ch = 0xa8;

ch >>= 8;
printf("%02x\n", ch);

return 0;
}

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧