一.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
- unsigned(无符号)类型
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的取值范围如下:
不要问我为什么把其他的都算了,你看看其他的类型的取值范围都是四个字节八个字节的,太难算了,我们只要掌握了计算方法就好。
希望以上对您有所帮助!当然,如果文章出现错误,欢迎您在评论区或私信我指出哦~