看看我自己的机器:
仔细看数据区:
实际问题是出在变量定义......
肯定不是单片机不会加法...........
下面看看数制转换:
看看-1和正1的表示
我们看看负数编码方案:
1000 0000 表士-128,1111 1111 表示-1
符号幅度法有2个致命伤,1有2个0,2是从
+127到-0和从-127到+0不连续………
这2个缺陷太大,不好用!接着看补码法:
补码表示法:
1000 0000 表士-128,1111 1111 表示-1 (补码就是取反+1)正数范围是+0----+127,负数范围是-128-----负1。由于2N-1是奇数,(2N-1)/2个编码表示负整数,[(2^-1)/2]-1个编码表示正整数。显然,可以表示的负整数比正整数多一个。最大负整数的幅度要比最大正整数的幅度个数要多一个,好处是可以连续构成笛卡尔数轴,并且只有一个0。显然32位机器比8位,数的范围大很多。
负整数补码的计算:
注意特殊的点位:
-1的二进制数就是 1111 1111,有个特例是-128,因为+128已经溢出(超过8位二进制数正数0---127的范围),就规定-128的补码是10000000。理由如下:
8位二进制的原值表达范围为:-127至127,共有256个组合序列00000000至11111111。+128的原值在8位中是表达不出来的。下面从两个角度理解+128的补码为什么是10000000.(1)从补码的意义上去理解:因为:256-128=256+(-128)的补码–机器中只有加法。减法会变成补码的加法。而256-128=128,所以256+(-128)的补码=128,所以(-128)的补码=256-128=128,数学上,128=10000000,故规定-128的补码为10000000