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

解决方案 »

  1.   

    sum的数据类型是什么,它够宽吗,是不是因为移位导致溢出了?
    至于 sum << 4 等于 0x00000dd0(为什么变为8byte?),它没有变8字节呀,一个0代表二进制0000,只有半个字节,总共不是正好4字节吗
      

  2.   

    不好意思 我数错了,sum是unsigned short(2字节)
               上面是我在quickwatch中看到的结果
    我的程序运行后总不是我想要的结果
      

  3.   

    我试了下,发现没问题呀,我建了个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我也不知道你是怎么回事,帮不了忙
      

  4.   

    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
      

  5.   

    没有问题,rebuild all看看。
      

  6.   

    sum << 12  为什么等于? 0x03740000 我想应该等于(0x000dd000)
    是的。
      

  7.   

    先谢谢大家
    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
    不是我期望的*/
      

  8.   

    在quickwatch中要注意你的显示方式,是不是16进制还是10进制
    你在10进制下输入 0x00dd << 12得905216即0x000dd000
    在16进制下输入0x00dd << 12得0x03740000 即57933824
      

  9.   

    是的,谢谢,果然是进制的问题!
          0x00dd << 0x000c 就对了,虽然不像我想象的
          0x00dd << 0x000c 得 0x000dd000 而不是 0xd000