目录
前言
本文针对C语言小白速通,不进行详细的C语言原理讲解,主打一个实用,高速,如有问题可在评论区评论,后续会出精讲版,敬请期待!
数制
仙友们,咱又来了!在座各位都是练气五层及以上的仙友了,接下来开始介绍以下各类空间戒指的种类了(数据类型)。学习变量的时候提到过,变量的空间大小依据其数据的类型。类似于各位仙友空间戒指的空间的大小也依据其空间戒指的种类。在学习数据类型的时候,我们需要知道计算机是如何存储和识别数的!
计算机的所有数据都是以二进制的形式表示与存储的,但为了提高其可读性,学习过程中可能会用八进制或十六进制表示,但其原理都是大同小异的。
什么是进制?
进制是一种计数方式,包括固定的符号集和统一的规则。一般进制规则就是满n进1,而n表示固定符号集的个数,n=2时就是二进制,n=10就是十进制。常见进制的符号集有:
按照常用性排序
- 十进制 0 1 2 3 4 5 6 7 8 9
- 二进制 0 1
- 十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 八进制 0 1 2 3 4 5 6 7
以十进制为例,十进制存在10个固定符号0-9,当数值大于9则进1变10;类似的二进制有两个固定符号 0和1,当数值大于1时进1变10,二进制的10表示的就是十进制中的2。
二进制
当前计算器均采用二进制的方式进行数据存储和运算,其机制就是逢2进1。
二进制的运算规则
加法:0+0=0 1+0=1 0+1=1 1+1 =10
减法:0-0 =0 1-0 =1 1-1 =0 10-1=1
乘法:0 * 0=0 1*0=0 0*1=0 1*1= 1
除法:0/1=0 1/1=1
例如,二进制加法 1100+0111,计算如下
二进制转换为十进制
很简单,以小数点为界,左边是整数部分,右边是小数部分。直接套公式吧:
k是二进制数最高位数索引;i是权重每一位的权重是根据其位置决定的,小数点左边第一个i为0,往左一位i+1,往右一位i-1 ,依此类推;n则为每位上的系数0/1。
直接上示例
二进制 1101
十进制
二进制 1000.01
十进制
八进制和十六进制
八进制和十六进制的转换原理相同,就是符号集不一样,八进制只有0~7八个符号集,十六进制有0~9和A~F一共十六个符号集,A等于十进制的10,F等于十进制的15。转换机制和二进制一样,就是将公式最后的基数2改成8或者16
数制间的转换
使用标准输出函数printf()可以直接进行进制转换输出,但此时需要格式控制参数,具体如下:
格式控制参数 | 描述 |
%d | 十进制有符号整型 |
%u | 十进制无符号整型 |
%f | 十进制浮点数 |
%o | 八进制数 |
%x | 十六进制数 |
整型
就是整数,没有小数点的整数,5.0不算,5这种才是,根据其空间大小不一样和是否有正负号可分为七类
- 字符型 char
- 短整型 short int
- 整型 int
- 长整型 long int
- 无符号短整型 unsigned short
- 无符号整型 unsigned int
- 无符号长整型 unsigned long
无符号表示只有正数没有负数
1.取值范围
根据不同数据类型其存储空间和格式不一样,取值范围会不一样。空间大小的分配看编译环境,既看你自己的编程软件,在32位或者64位的操作系统中一般空间分配大致为:
类型 | 说明 | 字节 | 范围 |
字符型 | char | 1 | 0~255 |
短整型 | short | 2 | -32768~32768 |
整型 | int | 4 | -2147483648~+2147483648 |
长整型 | long | 4 | -2147483648~+2147483648 |
无符号短整型 | unsigned short | 2 | 0~65535 |
无符号整型 | unsigned int | 4 | 0~4294967295 |
无符号长整型 | unsigend long | 4 | 0~4294967295 |
2.有符号整型和无符号整型
有符号的数据类型因为需要表示正负,正负表示会占一位空间。下面以一个字节八位举例
10的二进制表示 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
-10的二进制表示 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
有符号类型的第一位是符号位,0表示是正数,1表示是负数,因此一个字节只剩下7位去存储数据。对于无符号整数,一个字节八位都会用来存储数据
3.类型间转换
不同类型的整型数据占据的空间大小不一样,表示的范围大小也不一样,在类型转换时需注意切勿将过大的数据放进小的数据中,否则空间会爆满,会溢出,会混乱。例如
unsigned a=256;
char b=a;
printf("%d",b);
此时你获得的输出是 0 而不是256,原因是256超过了char的数据范围0 ~ 255,数据溢出了,从数据空间来看是出现了截断:
a | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
b | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
b就一个字节,a两个字节,在赋值过程中,a的高八位丢失,被截断。
字符型
字符型的整型数据的其中一种,不同的是其他整型数据表示的都是一个整数,但字符型表示的是一个ASCII字符(美国信息交换标准代码),但其实际都是存储的一个数,只不过在展示的时候,将这个数按照ASCII表转换成了字符。例如字符A的ASCII码是65,其在计算机中存储的是65这数字的二进制码0100 0001,但其表示的意思不是65,而是ASCII表中65对应的字符A。ASCII的详细内容此处不作赘述。
浮点型
浮点型可以表示有小数部分的数据,根据其存储空间不同和精度不同,可分为三类
- 单精度浮点型 float
- 双精度浮点型 double
- 长双精度浮点型 long double
具体如表所示
类型 | 位数 | 有效数字 | 取值范围 |
float | 32 | 6~7 | -1.4e-45~3.4e38 |
double | 64 | 15~16 | -4.9e-324~1.8e308 |
long double | 128 | 18~19 |
类型转换
隐形转换
在不同数据就行运算时,C语言偷偷的将数据类型进行了转换,从而达到统一,其转换顺序如图:
比如,当char和int一同运算时,C语言会偷偷将char转换为int进行运算;再比如当int和long和double一起运算时,会将int和long转换为double然后再运算。
显性转换
当多种数据类型进行运算时,当你明确的知道自己想要用哪种数据类型时,可以强制数据类型转换,也称显性转换。
格式如下:
(数据类型)变量或常量
(数据类型)表达式
例如:
int a=3;
float b=3.14;
float c;
(int) c=a+b;
这里就强制将 b和c转换成了int型。