sum = 0x00dd
sum << 4 等于 0x00000dd0(为什么变为8byte?)
sum << 8 等于 0x0000dd00
sum << 12 为什么等于? 0x03740000 我想应该等于(0x000dd000)
(sum << )8 >>12 为什么等于? 0x00000000 我想应该等于(0x0000000d)
(VC++, win2000, PIII 733)
sum << 4 等于 0x00000dd0(为什么变为8byte?)
sum << 8 等于 0x0000dd00
sum << 12 为什么等于? 0x03740000 我想应该等于(0x000dd000)
(sum << )8 >>12 为什么等于? 0x00000000 我想应该等于(0x0000000d)
(VC++, win2000, PIII 733)
至于 sum << 4 等于 0x00000dd0(为什么变为8byte?),它没有变8字节呀,一个0代表二进制0000,只有半个字节,总共不是正好4字节吗
上面是我在quickwatch中看到的结果
我的程序运行后总不是我想要的结果
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我也不知道你是怎么回事,帮不了忙
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
是的。
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
不是我期望的*/
你在10进制下输入 0x00dd << 12得905216即0x000dd000
在16进制下输入0x00dd << 12得0x03740000 即57933824
0x00dd << 0x000c 就对了,虽然不像我想象的
0x00dd << 0x000c 得 0x000dd000 而不是 0xd000