整型的最小取值为什么是-32768,而不是-32767

来源:百度知道 编辑:UC知道 时间:2024/09/24 04:47:43
(最佳答案加50分。)

最大值是 0111 1111 1111 1111 第一个0表示正,后面15个1转化为十进制是32767.这个可以理解。
那么我下面的理解哪里错了。
要表示一个最小值,应该是一个负号,然后后面跟绝对值最大的数,那么应该是 1111 1111 1111 1111,第一个1是负号,后面15个1是32767,合起来是-32767。如果负数要表示为补码,那1111 1111 1111 1111 的补码是1000 0000 0000 0000 + 1 =1000 0000 0000 0001,就是-1(第一个1表示负号). 不知道-32768是哪来的。

看的别人的一个分析是“-32768在内存中的表示是1000 0000 0000 0000。过程是:先读入正值32768(1000 0000 0000 0000),再取反(0111 1111 1111 1111),再加1(1000 0000 0000 0000) ”。这里,如果正值32768是(1000 0000 0000 0000),那最前面那个1就不是负号了,而就是1了。如果是符号这里就应该是-0.为什么又不是负号了呢?还有整数取反不是本身么,这里取反为什么是这样?而且他说“再加1”,加完之后是1000 0000 0000 0000,这个第一个如果是负号,那么这个数就是-0,如果不是符号,那么就是32768.怎么会是-32768呢?

没错 内存中整数是用补码形式储存,如果是用原码形式储存由于0可以表示为
0000 0000 0000 0000[+0] 或者 1000 0000 0000 0000[-0]
所以只能表示-32767~32767

但是如果用补码储存,0[+0或-0]就被唯一确定了是0000 0000 0000 0000
多出来的一位用于表示最小整数,即-32768
所以最小整数取值-32768

所谓补码即原码除去符号位取反加1

补充资料:
若机器码字长有n+1位,则:
原码定点小数表示范围:-(1-2^(-n)) ~ (1-2^(-n))
补码定点小数表示范围:-1 ~ (1-2^(-n))
原码定点整数表示范围:-(2^n-1) ~ (2^n-1)
补码定点整数表示范围:-2^n ~ (2^n-1)

可见补码都比原码多表示一个数,即最小数,所以机器储存一般使用的是补码形式

源码中,正零和负零都表示零;补码中,正零还是零,但“负零”用来表示最小值(-32768),这可以看成是一种约定。另外
0111 1111 是正的最大值,再加1,就“应该”是最小值,即1000 0000

没错 内存中整数是用补码形式储存,如果是用原码形式储存由于0可以表示为
0000 0000 0000 0000[+0] 或者 1000 0000 0000 0000[-0]
所以只能表示-32767~32767

但是如果用补码储存,0[+0或-0]就被唯一确定了是0000 0000 0000 0000
多出来的一位用于表示最小整数,即-32768
所以最小整数取值-32768

所谓补码即原码除去符号位取反加1