有符号数值类型的最大值加1为什么是其最小值?

xiaoxiao2021-02-27  312

请尊重原创,转载请注明出处: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;

转载请注明原文地址: https://www.6miu.com/read-3377.html

最新回复(0)