新手最近学到int ishift=getkeystate(0x10)
            ishift&0x80000000来判断shift键是否按下。这里我在计算器上算的0x80000000的二进制是1000 0000 0000 0000 0000 0000 0000 0000。但是网上却说是
                                        0100 0000 0000 0000 0000 0000 0000 0000按照32位编译来说,前面我计算器得出的结果在系统里占用了符号位溢出了,我了解。我不懂得事这种溢出怎么解决,书上也没做过多解释,百度也搜索不到结果,只说补码取反+1。但是我取反+1得出的结果是:
                                        1000 0000 0000 0000 0000 0000 0000 0000 0 
我的问题是:           1.不明白0100 0000 0000 0000 0000 0000 0000 0000是怎么的出来的,本人比较愚笨,是不是我二进制计算方法搞错了。希望好心人解释下。
           2.数据溢出的解决办法。是直接截断超出的部分还是要采取其他方法
           3.补码不是只用于负数运算吗,怎么在数据溢出里也要用到补码,很迷惑。百度搜索了几个小时还是没想通,才到这求助,谢谢。

解决方案 »

  1.   

    http://zhidao.baidu.com/question/6736892.html
    百度上的最佳答案:0x80000000是十六进制,转为int 是0.
    0x80000000的二进制是
    0100,0000,0000,0000,0000,0000,0000,0000
    转化为int时,只取前四个字节,舍去多余的头,就是:
    0000,0000,0000,0000
    也就是0NND,谁这么缺德,给的这个答案?
      

  2.   

    这个数换算成二进制,在32位里已经溢出了,最高位1占用了符号位。
    十进制表示是:2147483648 32位平台:2147483647这个数已经超过32位处理的最大值了啊啊啊啊啊啊 二进制表示是:1000 0000 0000 0000 0000 0000 0000 0000,如果放在32位系统看,这个数是实际上是-0,
    这很明显有问题啊。
    ishift&0x80000000非0表示按下,0表示没有按下
    这样做的话,32位表示的是符号位,符号位的相互与完全没意义啊,得出的结果都是0是不是我把什么楷念搞错了????
      

  3.   

    有符号无符号只有比较的时候才有用。如
    int a = 1;
    int b = -1
    if (a > b)
     xxx
    不进行比较计算机是不会知道什么有符号的。
      

  4.   

    32位没有-0,0x8000.....代表的是-(2^32-1),而0xFFFFFFFF则是-1,然后再+1即0x00000000(实际溢出了)
      

  5.   

    你不要在calc上求OK?calc有专门针对大数。
    int a=0x80000000;
    int b=0xFFFFFFFF;
    printf("a=%d b=%d",a,b);
    多简洁,多明了?
    我写的是负二的三十二减一次方,可能写的不怎么对
      

  6.   

    你这个代码放进VC里得到的结果和0x80000000的补码结果是一样的a=-2147483648 b=-1Press any key to continue如果照这样的话,我理解为,第32位的确溢出了。所以为了解决溢出,用补码表示得到的结果就是-2147483648所以0x80000000实际传入的数值是-2147483648 ,如果最高位和传入的0进行与操作,整个数就为0了也就是假。如果和1进行与操作,这个数还是-2147483648,为真。不知道这样理解对不对。为了继续学下去,也只能这样理解了。
      

  7.   

    32位溢出?
    int a=0x80000000;
    int b=0xFFFFFFFF;
    printf("a=%d b=%d\n",a,b);
    printf("a=%u b=%u\n",a,b);
    getchar();
    LZ看明白它你就懂了
      

  8.   

    很多人,看书看完了,当时自认为自己的观点肯定是对的(我也是),请静下心来,好好想想。
    ===========================LZ请看懂以下这句============
    printf("a=%u b=%u\n",a,b);
      

  9.   

    谁说32位平台的取值范围是-2的31次方?
    C语言里有N种数据类型,char,unsigned char,int unsigned int,long........难道都一样?
      

  10.   

    你说的那个取值范围是int型的取值范围,而且是signed int(就是说有正负号)
    UINT(无正负号,第32位仍作为数值)取值范围是 0~~~ 2^32 -1
    同理calc可能是double型的,取值 -2^63 ~~ 2^63 -1  或无符号..
      

  11.   

    书上的定义是这样的:
    const int key=0x80000000;问题可能出在这个const int上吧,我不知道写这本书的人为什么要这么取范围。它直接用uint声明的话,我也不至于纠结这么久。算了,谢谢大家的回复.先放着,以后应该自然就懂了