~0u右移一位得到的为什么仍是ffff

采石工 2010-12-15 01:58:29
我的问题见下面,请高手不吝赐教?

#include <stdio.h>

int main()
{
printf("%hx\n",~0);
printf("%hx\n",~0u);
printf("%hx\n",~0>>1);
printf("%hx\n",~0u>>1);//这行为什么得不到7fff
printf("%hx\n",0xffff>>1);//这行得到的为什么是7fff
printf("%hx\n",0xffffu>>1);

return 0;
}
...全文
285 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
we_sky2008 2010-12-15
  • 打赏
  • 举报
回复

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("%x\n",~0);
printf("%x\n",~0u);
printf("%x\n",~0>>1);
printf("%x\n",~0u>>1);//这里~0u >> 1 == 0x7ffffffff; 但是楼主只显示了低2字节,所以应该用%x而不是%hx
printf("%x\n",0xffff>>1);//32位的话0xffff相当于0x0000ffff; 0x0000ffff >> 1 == 0x00007ffff;
printf("%x\n",0xffffu>>1);

system("pause");
return 0;
}

matrixcl 2010-12-15
  • 打赏
  • 举报
回复
1楼没说到点子上

%hx格式控制第一次见(只见过%x),不过从结果看是16进制格式输出16位整数。

0u是32位数,~0u是32位均为1,~0u>>1 = 0x7fffffff, 输出是强转成16位还是FFFF。

printf("%hx\n",~0u>>18);//看看这个结果
采石工 2010-12-15
  • 打赏
  • 举报
回复
谢谢你的回复,你说的我明白,~0u就是把~0规定为无符号型,为什么其在右移一次后仍为ffff
[Quote=引用 1 楼 hai040 的回复:]

有符号数右移高位是不变
无符号数右移高位补0
结果等于/2
[/Quote]
aiwoziji13 2010-12-15
  • 打赏
  • 举报
回复
首先你的机子是32位的 所以0在你机子上默认是占4个字节的

你所有的 printf 都是用%hx 打印的 这样只打印了低16位的数值

printf("%hx\n",~0u>>1);//这行为什么得不到7fff
实际 ~0u>>1 后的数值时7fffffff 你用%hx打印 小端模式下取的是低16位
所以是ffff

printf("%hx\n",0xffff>>1);//这行得到的为什么是7fff
pc默认0xffff是无符号数 所以右移移位后为7fff

分别换成如下的代码 你再试试
printf("%x\n",~0u>>1);//这行为什么得不到7fff
printf("%hx\n",(signed short)0xffff>>1);//这行得到的为什么是7fff
we_sky2008 2010-12-15
  • 打赏
  • 举报
回复
楼主的机子是16位的吗?
这样试试:

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("%x\n",~0);
printf("%x\n",~0u);
printf("%x\n",~0>>1);
printf("%x\n",~0u>>1);
printf("%x\n",0xffff>>1);//32位的话0xffff相当于0x0000ffff
printf("%x\n",0xffffu>>1);

system("pause");
return 0;
}
luciferisnotsatan 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]

有符号数右移高位是不变
无符号数右移高位补0
结果等于/2
[/Quote]
正解
hai040 2010-12-15
  • 打赏
  • 举报
回复
有符号数右移高位是不变
无符号数右移高位补0
结果等于/2

69,368

社区成员

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

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