[C语言]对有符号整形数据类型取值范围详解

我们以32位系统,短整型为例,也就是两个字节16个比特位,对于其他整形类型,可以将位数设为n,只要将不同类型n的值改动就可以得到对应的取值范围

1.我们需要准备以下知识点

  • 整数最高位为符号位,0为正,1为负
  • 电脑里对整数的存储是按照补码形式存储的
  • 负数的原码保留符号位,其它位按位取反,能得到反码,反码在加1可以得到补码
  • 正数的原反补相同
  • 补码的补码是原码
  • 如果加一之后位数超过16位,将最高位溢出
  • 先说结论,短整型取值范围-2^15~2^15-1

2.最大值取值

按照初中知识,我们只要将符号位锁定为0,保证值为正,其它位全部设为最大,即全部设为1就可以得到最大值即

0111 1111 1111 1111

由于正数原反补相同,以上思路确实是正确的,由于1000 0000 0000 0000为2^15,
而1000 0000 0000 0000 -1=0111 1111 1111 1111,所以最大值为2^15-1

3.最小值取值

按照初中知识,绝对值最大的负数是最小的数,所以对于原码我们将符号位锁定为1,使其为负,其它位全部设为最大,即全部设为1就可以得到最大值即

1111 1111 1111 1111 其值为-(2^15-1),那么问题来了,为什么结论的最小值是-2^15,为什么最小值比正常思路推算的还小1

这就要涉及到计算机里对于数值的存储是按照补码存储的,你也许会觉得既然补码都有其对应的原码,我们依然可以按照正常的思路取得最极端的值,反正每一个原码都有一个对应的补码,最极端的原码对应最极端的补码

这里我们可以尝试求一下1111 1111 1111 1111的补码
反码:1000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0001

但如果我要说最极端的补码其实是1000 0000 0000 0000 0000呢,

我们可以求一下其原码
补:1000 0000 0000 0000 0000
反:1111 1111 1111 1111 1111
原:1 0000 0000 0000 0000 最高位溢出得0000 0000 0000 0000

没错,上面这个补码对应的原码其实是0,而我们知道补码0000 0000 0000 0000已经可以代表0了,我们要让用两个补码都代表0吗,显然不

所以人为规定补码1000 0000 0000 0000 0000 比-(2^15-1)再小1,为-2^15

4.其他整形类型

其他整形类型同理,比如整形我们就可以将15换成31

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值