新手最近学到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.补码不是只用于负数运算吗,怎么在数据溢出里也要用到补码,很迷惑。百度搜索了几个小时还是没想通,才到这求助,谢谢。
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.补码不是只用于负数运算吗,怎么在数据溢出里也要用到补码,很迷惑。百度搜索了几个小时还是没想通,才到这求助,谢谢。
百度上的最佳答案:0x80000000是十六进制,转为int 是0.
0x80000000的二进制是
0100,0000,0000,0000,0000,0000,0000,0000
转化为int时,只取前四个字节,舍去多余的头,就是:
0000,0000,0000,0000
也就是0NND,谁这么缺德,给的这个答案?
十进制表示是:2147483648 32位平台:2147483647这个数已经超过32位处理的最大值了啊啊啊啊啊啊 二进制表示是:1000 0000 0000 0000 0000 0000 0000 0000,如果放在32位系统看,这个数是实际上是-0,
这很明显有问题啊。
ishift&0x80000000非0表示按下,0表示没有按下
这样做的话,32位表示的是符号位,符号位的相互与完全没意义啊,得出的结果都是0是不是我把什么楷念搞错了????
int a = 1;
int b = -1
if (a > b)
xxx
不进行比较计算机是不会知道什么有符号的。
int a=0x80000000;
int b=0xFFFFFFFF;
printf("a=%d b=%d",a,b);
多简洁,多明了?
我写的是负二的三十二减一次方,可能写的不怎么对
int a=0x80000000;
int b=0xFFFFFFFF;
printf("a=%d b=%d\n",a,b);
printf("a=%u b=%u\n",a,b);
getchar();
LZ看明白它你就懂了
===========================LZ请看懂以下这句============
printf("a=%u b=%u\n",a,b);
C语言里有N种数据类型,char,unsigned char,int unsigned int,long........难道都一样?
UINT(无正负号,第32位仍作为数值)取值范围是 0~~~ 2^32 -1
同理calc可能是double型的,取值 -2^63 ~~ 2^63 -1 或无符号..
const int key=0x80000000;问题可能出在这个const int上吧,我不知道写这本书的人为什么要这么取范围。它直接用uint声明的话,我也不至于纠结这么久。算了,谢谢大家的回复.先放着,以后应该自然就懂了