关于移位操作

deepool 2003-08-20 10:42:20
sum = 0x00dd
sum << 4 等于 0x00000dd0(为什么变为8byte?)
sum << 8 等于 0x0000dd00
sum << 12 为什么等于? 0x03740000 我想应该等于(0x000dd000)
(sum << )8 >>12 为什么等于? 0x00000000 我想应该等于(0x0000000d)
(VC++, win2000, PIII 733)

...全文
78 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
deepool 2003-08-21
  • 打赏
  • 举报
回复
是的,谢谢,果然是进制的问题!
0x00dd << 0x000c 就对了,虽然不像我想象的
0x00dd << 0x000c 得 0x000dd000 而不是 0xd000
思危 2003-08-20
  • 打赏
  • 举报
回复
是呀,不可能
balas 2003-08-20
  • 打赏
  • 举报
回复
sum << 12 为什么等于? 0x03740000 我想应该等于(0x000dd000)
是的。
canany1tellme 2003-08-20
  • 打赏
  • 举报
回复
没有问题,rebuild all看看。
lvcjh 2003-08-20
  • 打赏
  • 举报
回复
int sum = 0x00dd;
char buffer[200]="\0";
sprintf(buffer,"%x",sum << 4);
printf(buffer); //结果dd0
buffer[0]='\0';
sprintf(buffer,"%x",sum << 8);
printf(buffer); //结果dd00
buffer[0]='\0';
sprintf(buffer,"%x",sum << 12);
printf(buffer); //结果为dd000
buffer[0]='\0';
sprintf(buffer,"%x",(sum <<8)>>12);
printf(buffer); //结果为d

你是不是把sum定义为了short.
需要把sum定义为int,或long

hanzp 2003-08-20
  • 打赏
  • 举报
回复
我试了下,发现没问题呀,我建了个console程序,
int main(int argc, char* argv[])
{
unsigned short sum;
sum = 0x00dd;
printf("%x\n", sum);
sum = sum << 12;
printf("%x\n", sum);
return 0;
}
结果很正常啊,是
dd
d000

我也不知道你是怎么回事,帮不了忙
deepool 2003-08-20
  • 打赏
  • 举报
回复
不好意思 我数错了,sum是unsigned short(2字节)
上面是我在quickwatch中看到的结果
我的程序运行后总不是我想要的结果

hanzp 2003-08-20
  • 打赏
  • 举报
回复
sum的数据类型是什么,它够宽吗,是不是因为移位导致溢出了?
至于 sum << 4 等于 0x00000dd0(为什么变为8byte?),它没有变8字节呀,一个0代表二进制0000,只有半个字节,总共不是正好4字节吗
Phourm 2003-08-20
  • 打赏
  • 举报
回复
在quickwatch中要注意你的显示方式,是不是16进制还是10进制
你在10进制下输入 0x00dd << 12得905216即0x000dd000
在16进制下输入0x00dd << 12得0x03740000 即57933824
deepool 2003-08-20
  • 打赏
  • 举报
回复
先谢谢大家
USHORT sum = 0x00dd;
//程序段一:
cksum[0] = (sum & 0x000f ) + 0x30;
cksum[1] = ((sum >> 4) & 0x000f) + 0x30;
cksum[2] = ((sum >> 8) & 0x000f) + 0x30;
cksum[3] = ((sum >>12) & 0x000f) + 0x30;
cksum[4] = 0x00;
/*运行到此结果为
cksum[0] 0x3d
cksum[1] 0x3d
cksum[2] 0x30
cksum[3] 0x30
cksum[4] 0x00
是我期望的*/
//程序段二:
cksum[0] = ((sum <<12) >> 12) + 0x30;
cksum[1] = ((sum << 8) >> 12) + 0x30;
cksum[2] = ((sum << 4) >> 12) + 0x30;
cksum[3] = (sum >>12) + 0x30;
cksum[4] = 0x00;
/*运行到此结果为
cksum[0] 0x0d
cksum[1] 0x3d
cksum[2] 0x30
cksum[3] 0x30
cksum[4] 0x00
不是我期望的*/

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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