关于整型在内存中的存储规则

一.C语言中的类型

C语言的内置类型:

  • char --字符类型(1个字节)
  • short --短整型(2个字节)
  • int --整型(4个字节)
  • long --长整型 (4/8个字节)
  • long long --更长的整型(8个字节)
  • float --单精度浮点型(4个字节)
  • double --双精度浮点型(8个字节)

整型家族:

  • 整型家族又分为
    • unsigned(无符号)类型
      • unsigned char
      • unsigned short
      • unsigned int
      • unsiged long
      • unsignedlong long
    • (有符号)signed类型
      • signed char
      • sined short
      • sined int
      • signed long
      • signed long long
ASCLL码表

可能很多人看到这里就有疑惑了?你不是说char是字符类型吗?为什么有把char放到了整型家族中呢?原来,在字符类型在内存中进行存储时,存储的时ASCLL码值,其实就是输入一个字符类型时,在内存中以数字的形式进行保存了起来,毕竟计算机可不认识字符,人家只认识0/1嘞。所以不难理解为什么char类型划分到整型家族中来。
附图(基本的ACLL码表):在这里插入图片描述

-浮点数家族

  • float
  • double

当然,C语言中可没有字符串类型啊

为什么C语言中为什么分这么多类型呢?

这是因为如果拿一块很大的内存空间去放一个很小的数字,会导致内存的浪费。所以C语言将整型分为了多种形式用来提高对内存空间的使用率。
看到这里,很多人便恍然大悟,原来如此!

那既然明白了以上的内容,那这些类型存在的意义又是什么呢?

  • 类型决定了变量在内存中开辟空间的大小
  • 开辟空间的大小有决定了这个变量的使用范围是多少
  • 类型也决定了如何去看待存储的视角。

二. 整型数据在内存中的存储规则

整型是以二进制的形式进行存储的,而内存中进行存储的却又是他的补码。

二进制的三种形式:

  • 原码:
  • 将一个十进制的数直接转换为二进制序列,这个二进制序列就是他的原码
    • 例如:-16
    • 16是一个整型,整型的大小是4个字节,4个字节是32个bite位。
    • 10000000 00000000 00000000 00010000 --这就是-16的原码(由32个0/1组成)
  • 反码:
  • 反码是原码的最高位(符号位)不变,其他位取反
    • 11111111 11111111 11111111 11101111 --这就是-16的反码
  • 补码:
  • 补码就是反码+1
    • 11111111 11111111 11111111 11110000 --这就是-16的补码

如果有细心的小伙伴应该发现了一个问题:
整型不是有正负之分吗?,那么正整型的原码、反码、补码和负整型的原码、反码、补码有什么不同呢?

正整数的原码、反码、补码三码合一(说人话就是正整数的原码就是他的反码,也是他的补码)。
而不论正整数还是负整数,二进制序列的最高位也就是这个二进制的符号位,符号位为0表示正正数,符号位为1表示负整数。

三.unsigned整型和signed整型的差异

unsigned整型和signed整型的差异我们用char类型举列:
unsigned char:unsigned char的取值范围应该实在0-255之间,
为什么呢?

char的大小是1个字节,而1个字节有8个bite位组成,那么char的最大范围是2^8,也就是255,为什么不是256或者更大呢?255的二进制是11111111,在加上1,1 00000000。而char只有1个字节的大小,只能有8个bite位组成,所以会发生整型截断,只保存后面的8位二进制序列:00000000,将00000000转换为十进制就是0。
我们从上面可以得到一个规律:unsigned char如果是255+1,那么他的再内存中其实存储的是0;如果是0-1,那么他在内存中存储的是255。所以unsigned char的取值范围也就是0-255。

验证:
在这里插入图片描述
为什么打印的第一行什么都没有呢?我是用%c打印的。可以看上面的ASCLL码表,0在ASCLL码表中对应的是 (空),而255+1是0,那么255+100是99,99对应的ASCLL码值是不是c呢,大家可以放上去查看哦~

那么signed char的取值范围是多少呢?我们也可以根据上文讲的知识进行推算:
signed char的大小是1个字节,有8个bite位组成,有8个1/0组成。当他的二进制序列为:11111111时,最高位是符号位,符号位是1代表负数,剩下的七位转换为二进制是:-128,要是再加一位的1,二进制序列也就是111111111,同理,他的超过了char类型的大小,再发生存储时会发生整型截断,结果还是保留最后的8位,11111111,转换为二进制是-128。如果符号位为0,01111111,将这个二进制序列转换为十进制是127。所以,signed char的取值范围是(-128) - (+127)。
那么我们也不难发现signed char如果是127+1,那么他的再内存中其实存储的是-128;如果是-128-1,那么他在内存中存储的是127。

验证:
在这里插入图片描述
在这里插入图片描述
同样,-128+1是127,127在ASCLL码表中对应的字符是 (DEL),而-128-2是+126;127+1是-128,那么对应的ASCLL码值是不是+126呢,-128对应的字符是不是€呢?可以在 https://www.cnblogs.com/mmzuo-798/p/6323624.html这里查看大佬列出的所有ASCLL码值哦

而其他的unsigned和signed的取值范围如下:
在这里插入图片描述
不要问我为什么把其他的都算了,你看看其他的类型的取值范围都是四个字节八个字节的,太难算了,我们只要掌握了计算方法就好。
希望以上对您有所帮助!当然,如果文章出现错误,欢迎您在评论区或私信我指出哦~

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值