请尊重原创,转载请注明出处:http://blog.csdn.net/mabeijianxi/article/details/71170170
下面以C语言中char为例子:
都知道其无符号取值范围是0~2^8也就是0~255。原因很简单,其二进制为8位,最大值自然是1111 1111,转换为10进制:1*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6+1*2^7=255。
那么如果是有符号char呢?按照规定有符号数值的最高为表示符号位,1为负数,0为正数。1111 1111则为:-(1*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6)= -127,随便说一点有符号char的最小值的-128,其二进制是按理应该是1 1000 0000,但是char最多八位,所以舍弃最高位。其二进制为 1000 0000,这个值其实恰好表示-0,因为没有-0这个数所以不冲突,不会影响计算。
回归问题,有符号数值类型加1为什么是最小值?
有符号 char最大值:
0111 1111
+10000 0001
----------------------------
1000 0000
上面也说了,1000 0000表示 -128,这种规律适用于其他的有符号数据类型。
顺便记录下与负数的加减:
计算机存储数值形数据都是以补码储存的,正数反码补码都是其原码,负数反码为其原码除了符号位其余取反,补码是其原码的补码加1。运算的时候也是通过补码进行运算的。如-3+1:-3的原码为1000 0011,反码为:1111 1100,补码为:1111 1101,1原码、反码、补码都是 0000 0001;
-3+1:
1111 1101
+0000 0001
----------------------------------
1111 1110
1111 1110取其补码为:1000 0010 ,转10进制为-2;