当初的计划是一周保持一篇博客的更新,结果打开手机一看,回学校的票都快被抢完了。
没办法,牺牲一周多的假期提前回学校,结果赶上被安排迎接新生活动.......
现在也是得空出两天,来更新一篇博客吧
、
我前面的博客就提过,我喜欢用一些生活中简单易懂的例子或是方式来讲解一个知识。
所以今天的知识我就打算用并夕夕为主要教案来讲解。
一.数据类型的介绍
当我们点击一个购物网站。我们能看到各种各样的信息。
换句话说,我们能看到丰富的数据。
比如商品的名字,价格,销量......
而在C语言当中就提供了丰富的数据类型来描述这些数据
我们可以用整数类型来描述整数,比如一箱牛奶有几瓶,一箱饼干有几包。这些都是确定的整数。
可以用字符型来描述字符,比如这个空调的名字叫“xxxx”,这个地球是“学生专用”
使用浮点型来描述小数,就像上面六箱牛奶一起272.99元。
当然数据类型的种类还有很多,今天我们主要来讨论基本类型
不同的数据有不同特点,相似的数据也拥有共同的特征。
编译器也就会根据不同数据类型进行不同操作
如果像其他博客,这里可能就要开始长篇大论的讲述各种类型了
但我在这想说一句
因为看到这篇博客的,可能有对于编程已经得心应手的前辈,也会有很多刚开始学习的小白
所以我在这要补充一点之前没有提到的小知识
二.计算机中的单位
1.计算机中的最小存储单位:bit
在前面的文章,我们提到过,计算机程序是以二进制形式存储的。
二进制的取值是0和1,
在计算机的底层存储,就是一连串的0和1组成的序号。
每一个0或是1,就是最小的存储单位————比特(bit)。
2.计算机的基本存储单位:Byte
字节是计算机存储信息的基本单位。
上面我们提到的bit,可能很多人不是特别熟悉。
但这里提到的Byte,相信大家一定都不陌生了。
Byte,也叫字节,没错就是字节跳动那个字节。
在后续文章中我们提到的字节的大小都是这个东西。
3.换算关系
1B=8bit,
1KB = 2^10B = 1024B,
1MB = 2^10KB = 1024KB,
1GB = 2^10MB = 1024MB,
1TB = 2^10GB = 1024GB,
三.基本数据类型
在C语言当中有六种基本数据类型:short,int long,char,float,double
在次基础上,还发展出了short int,long int,long long int
在实际生活中,存在许多的数据,
在编程中,我们不能一概而论的将他们都设为一种形式。
所以,学习使用不同种类的数据类型是很有必要的
1.char
使用char时,主要用于存储字符的ASCII码。
类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
char | 1 字节 | -128 ~ 127 | 补码 | |
signed char | 1 字节 | -128 ~ 127 | 补码 | |
unsigned char | 1 字节 | 0 ~ 255 | 二进制 |
char类型存储时,占用内存大小为1字节
(有些文章会用方格来表示占用内存大小,每一个方格是1bit,四个方格是1byte)。
同时char类型又分为有符号的signed char类型和无符号的unsigned char类型
在平时编程中,如果不在char前加上符号,默认就是signed char类型
其实很好理解,就类似于正负号,不可以加上负号时,我们都默认它为正数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdbool.h>
int main() {
char c1 = 48;
char c2 = '0';
signed char c3 = 65;
signed char c4 = 'A';
unsigned char c5 = 97;
unsigned char c6 = 'a';
printf("%c\n", c1);
printf("%c\n", c2);
printf("%c\n", c3);
printf("%c\n", c4);
printf("%c\n", c5);
printf("%c\n", c6);
return 0;
}
看到这,有些人可能就有疑问了,为什么会出现相同的结果呢?
这就要看我们之前说到了,char类型存储的是·ASCII码
像我们输入的'0'并不是数字0,而是字符0,在ASCII码表中,它对应的值是48。
后面的'A'和'a'也是同理。
有关于signed char 和·unsigned char的使用,会涉及到二进制的补码和原码。
由于篇幅有限,无法彻底的讲解,我将在后续文章中详细讲解
2.整型
Ⅰ.short int
类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
short int (signed short int) | 2 字节 | -(2^15) ~ (2^15)-1 | 补码 | |
unsigned int | 2 字节 | 0 ~ (2^16)-1 | 二进制 |
short int 类型,占用内存大小为 2 个字节。
short [int]
[signed] short [int]
unsigned short [int]
short int 类型又分为有符号 signed short int 类型和 无符号 unsigned short int 类型,如果不在 short int 前面加上符号说明,默认是有符号 signed short int 类型。
Ⅱ.int
类型 | 占用内存大小 | 值范围 | 存储形式 | 内存示意图 |
int (signed int) | 4 字节 | -(2^31) ~ (2^31)-1 | 补码 | |
unsigned int | 4 字节 | 0 ~ (2^32)-1 | 二进制 |
int 类型,占用内存大小为 4 个字节。
int
[signed] int
unsigned int
int 类型又分为有符号 signed int 类型和 无符号 unsigned int 类型,如果不在 int 前面加上符号说明,默认是有符号 signed int 类型。
3.浮点型
float
单精度浮点数,占4字节。
输出结果保留小数点后6位小数,多余的按照四舍五入去掉,若不满六位用0补齐。
格式说明(即占位符,由%和占位字符组成):输出/入都是%f
double
双精度浮点数,8字节。
输出结果同样保留小数点后6位,多余的按照四舍五入去掉,若不满六位用0补齐。
格式说明(占位符):输入为%lf,输出为%f。
int main() {
float a1 = 12.34;
float a2;
double b1 = 23.45;
double b2;
scanf("%f", &a2);
scanf("%lf", &b2);
printf("%f\n",a1);
printf("%f\n", a2);
printf("%f\n", b1);
printf("%f\n", b2);
return 0;
}
4.布尔类型
在C语言里判断真假有一种标准:整数0表示假,非0为真
后来在C99标准中引入了布尔类型
bool(_Bool)
表示真为true
假为false
有一点值得注意的是
使用布尔类型需要添加头文件<stdbool.h>
5.计算数据类型长度
每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不 同,存储的数据范围就有所差异。
sizeof操作符
sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字 节。
sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
int main() {
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
int a = 10;
short s = 5;
int b = 10;
printf("%d\n",sizeof a);
printf("%d\n", sizeof(int));
printf("s=%d\n", sizeof(s = b + 1));
//sizeof里面的算术不参加运算
//sizeof最后计算的还是s所存放的数据大小
printf("s=%d\n", s);
s = b + 1;
printf("s=%d\n", s);
return 0;
}
四.变量
了解清楚了类型,那么我们使⽤类型做什么呢?
类型是⽤来创建变量的。
什么是变量呢?
C语⾔中把经常变化的值称为变量,不变的值称为常量。
变量同时也分为全局变量和局部变量
创建变量的语法形式:
数据类型 变量名
例:
int age;
char ch;
double weight;
变量的初始化:在创建变量时提供一个初始值
int a = 100;
int main() {
int b = 10;
{
int c = 1;
printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
}
printf("%d\n", a);
printf("%d\n", b);
//printf("%d\n", c);
return 0;
}
单这样讲还是比较枯燥,还是用并夕夕来举例子吧
像一种商品的价格,我们就通常设置为变量。
因为随着市场需求和供给变化,商品的价格也会随之发生改变
(咦,我好像在讲政治)
那如何理解全局变量和局部变量呢?
全局变量就好比你打在商场大门写着:全场9.9,样样9.9
所有的商品价格你都确定了,不管顾客拿走什么。都是9.9元出售。
而局部变量就是具体到哪个货架或是哪个商品的价格了。
他们不同的价格会不一样,也许某些数字大小相等,但你不能给他们同样一个标签牌。
局部变量只适用于局部,就好比你这商品是XX市yy超市特供,如果你拿到zz超市,那别人就不会承认你了
但这里又有一个细节了:如果局部和全局变量,名字相同呢?
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n" n);
//
打印的结果是多少呢?
return 0;
}
其实当局部变量和全局变量同名的时候,局部变量优先使⽤。
说的再通俗一点,局部变量拥有“最终解释权”.
五.算术操作符
在编写代码时候,⼀定会涉及到计算。
C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。
分别是:+ - * / % ,这些操作符都是双⽬操作符。
+ - *三个分别对应数学当中的加减乘,使用方法几乎没有过多差别,这里不在赘述
我们主要来探讨一下 / 和 %
1./
int main() {
int a;
scanf("%d", &a);
printf("%d\n", 3 + 3);
printf("%d\n", 3 - 3);
printf("%d\n", 3/3);
printf("%d\n", 5 / 3);
printf("%d\n", 5 % 3);
printf("%d", a);
return 0;
}
运算符 / ⽤来完成除法。
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。
2.%
运算符 % 表⽰求模(余)运算,即返回两个整数相除的余值。
这个运算符只能⽤于整数,不能⽤于浮点数。
负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
六.赋值
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a=100;//变量初始化
a=520;//变量赋值
赋值操作符 = 是⼀个随时可以给变量赋值的操作符。
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a=10;
a=a+3;
a=a-2;
a+=3;
a-=2;
上面两个会和下面输出相同的结果,但按照下面的写法会更加便利。
七.单⽬操作符:++、--、+、-
1.++和--
++是⼀种⾃增的操作符,⼜分为前置++和后置++,
--是⼀种⾃减的操作符,也分为前置--和后置--.
Ⅰ.前置++
int a=10;
int b=++a;
printf("a=%d b=%d\n",a,b);
计算⼝诀:先+1,后使⽤; a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以计算技术后,a和b都 是11
也就相当于下面的代码:
int a = 10;
a = a+1;
b = a;
printf("a=%d b=%d\n",a , b);
Ⅱ.后置++
int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a,b);
a原来是10,先使⽤,就是先赋值给b,
b得到了10,然后再+1,然后a变成了11,所以直接结束后a是 11,b是10
也就相当于下面的代码:
int a = 10;
int b = a;
a = a+1;
printf("a=%d b=%d\n",a , b);
前置--和后置--的操作和++相同,只不过一个是加一,一个是减一。
为锻炼大家的编程思考能力,这里就不再做机械系讲解了
(其实是我想偷懒了)
八.强制类型转换
在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
(类型)
这个类型可能是int float double......
在VS2022当中,如果你不小心写错数据类型,开发环境会帮你更正
但我们还是要学习一下有关于⽤强制类型转换
通过强转,我们就可以得到需要的数据类型了
但是
俗话说,强扭的⽠不甜我们使⽤强制类型转换都是万不得已的时候使⽤,
如果不需要强制类型转化 就能实现代码,这样⾃然更好的。
如果你看到这里,我对你说一声谢谢。
我并不是专业的计算机讲师,也知识编程道路上的一位学者
我也希望能用自己的一点努力帮助大家更好的学习知识。
参考文献: