C语言中字符变量数值取值范围。
C语言中有符号型字符变量的取值范围为什么是-128到127呢?应该是-127到127呀!符号位除外,最大的也就127最小的是-127,怎么是-128呢?
追问:来自手机问问模糊懂了一些,但128的二进制原码为:10000000,-128的反码为?补码?如果再用一个1表示符号位就有9位数了!而字符变量只占一个字节呀?
C语言中有符号型字符变量的取值范围为什么是-128到127呢?应该是-127到127呀!符号位除外,最大的也就127最小的是-127,怎么是-128呢?
追问:来自手机问问模糊懂了一些,但128的二进制原码为:10000000,-128的反码为?补码?如果再用一个1表示符号位就有9位数了!而字符变量只占一个字节呀?
答案: 有符号数,最高位用来表示符号位:0正1负。
最大的正整数:0111 1111(b) = 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 127,这个计算方法跟无符号整数最大值的计算方法一样。但在负数范围内,数值的计算方法不能直接使用 1*2^6 + 1*2^5的公式进行转换。
在计算机中,负数除最高位为1以外,采用补码的形式进行表达。所以在计算其值前,需要对补码进行还原。这里,先直观地看一眼补码的形式: 以我们原有的数学经验,在10进制中:1 表示正1,而加上负号:-1 表示和1相对的负值。那么,我们会很容易认为在2进制中(1个字节): 0000 0001 表示正1,则高位为1后:1000 0001应该表示-1。然而,事实上计算机中的规定有些相反,请看下表:
二进制值(单字节) 十进制值
1000 0000 -128
1000 0001 -127
1000 0010 -126
1000 0011 -125
… …
1111 1110 -2
1111 1111 -1
首先我们看到,从-1到-128,其二进制的最高位都是1,正如我们前面的学。然后我们有些奇怪地发现,1000 0000 并没有拿来表示-0;而1000 0001也不是拿来直观地表示-1。事实上,-1 用1111 1111来表示。怎么理解这个问题呢?先得问一句是-1大还是-128大?当然是 -1 大。 -1是最大的负整数。以此对应,计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那麼,1111 1111 – 1 是什么呢?和现实中的计算结果完全一致。 1111 1111 – 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用於表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。我们以-1为例,来看看不同字节数的整数中,如何表达-1这个数: 字节数二进制值十进制值单字节数1111 1111 -1 双字节数1111 1111 1111 1111 -1 四字节数1111 1111 1111 1111 1111 1111 1111 1111 -1 可能有同学这时会混了:为什么1111 1111 有时表示255,有时又表示-1?你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那麼当这个量的二进制各位上都是1时,它表示的数就是-1;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说,最大值就是255。因为无符号是0~255对吧,所以长度为255,那么有符号的则是范伟长度一样的,即
-128~127。