为什么char类型的取值范围是-128~127?

预备知识

1.等比数列求和公式
来自百度百科
2.二进制转十进制

1111 1111
= 1* 2 7 2^7 27+1* 2 6 2^6 26+1* 2 5 2^5 25+1* 2 4 2^4 24+1* 2 3 2^3 23+1* 2 2 2^2 22+1* 2 1 2^1 21+1* 2 0 2^0 20
=1*(1- 2 8 2^8 28)/(1-2)= 2 8 2^8 28-1=255

3.char类型占据1个字节,有8位二进制数,首位为符号位

  • 对于正数,符号位为0
  • 对于负数,符号位为1

4.反码

  • 正数的反码与其原码相同,0111 1111 ->0111 1111
  • 负数的反码是对正数逐位取反,符号位保持为1, 1111 1111 ->1000 0000

5.补码

  • 正数的补码与其原码相同,0111 1111 ->0111 1111
  • 负数的补码为其反码在最低位加1,1111 1111 ->1000 0000->1000 0001

解释

char有8位,除去符号位,还剩7位。

  • 正数
    0*** ****
    能表示的最大范围:
    0 000 0001~0 111 1111
    1* 2 6 2^6 26+1* 2 5 2^5 25+1* 2 4 2^4 24+1* 2 3 2^3 23+1* 2 2 2^2 22+1* 2 1 2^1 21+1* 2 0 2^0 20= 2 7 2^7 27-1=127


  • 由于首位为符号位,因此决定数值大小的只有后7位,
    因此0 000 0000和1 000 0000分别表示+0和-0.
    但这样用两个二进制数来表示一个数是多余的,
    因此我们用0000 0000来表示0,而1000 0000来表示 -128
    那为什么是-128呢?
    因为-128的原码是1 1000 0000,反码是1 0111 1111,补码是1 1000 0000
    但char只保留8位,溢出最高位,
    所以是1000 0000,也就是前面的-0,因此可以用1000 0000表示-128.
    我们用补码运算来检验一下,
    1000 0000(-128)+
    0000 0001(1)
    =(1000 0001)
    取补1111 1111=-127,正确

  • 负数
    1111 1111~1000 0001+1000 0000
    即为-128~-1

总结

综上所述,char类型的取值范围为-128~127
其他数据类型以此类推
特别的,对于unsigned类型(无符号数据类型)
其取值范围可以直接用[0, 2 n 2^n 2n-1](n为二进制数的个数)表示

问题

-128+(a<0)时,超出了char类型的范围,无法正确表示
这一点我们会在后面继续探讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值