(3)数据类型
认识一下C语言中的数据类型:
char 字符数据类型
short 短整型
int 整形
long 长整形
long long 更长的整形(C99这一标准提出)
float 单精度浮点数
double 双精度浮点数
(双精度比单精度的精度高一些,也就是说小数点后的位数表示能更多一些,精确一些)
在C语言中整数也叫整形,小数又叫浮点数,(那么C语言又是如何表示这些类型的呢?)
解释下:
如char类型
在写代码的时候,任何一个代码都是从main函数(主函数)开始
int main(){
char ch='A';
return 0;
}
在C语言中式如何表示一个字符呢?
用单引号引起一个字符,如:'A';(这就是char这种类型的一种基本用法。)
如果我们要把一个字型存起来的话,又该如何去存呢?
在【'A';】中要将其存储起来的话,那么就需要一个空间来存储,那这时就得向计算机内存申请一块空间来存放。(比如我们要把一本书放回书架中,而这时我们就需要书架。)
如何申请呢?
char——字符类型
我们用这种字符类型创建一个变量ch,这个ch就是向内存申请一块的空间,这个空间的名字就是ch,所以字符'A';就放在ch这块空间里。(char ch)
#include<stdio.h>
int main(){
char ch='A';
printf("%c\n",ch);
return 0;
}
【注:%c——打印字符格式的数据。】【“\n”——表示换行。】
以上代码中,printf("%c\n",ch);——这是C语言语法本身的一种形式。
意思是我以字符的形式打印ch。
以上就是char的使用形式,如若理解,其他也相似用法。
在举例,如果我们要表达一个整形的意思,如年龄写法为 int age=20;
即:
#include<stdio.h>
int main(){
int age=20;
printf("%d\n",age);
return 0;
}
【注:%d——打印整形十进制数据】
所以C语言代码中,数据类型是用来向内存申请空间来创建变量的。
疑问:既然有整形了,那为什么还有短整型呢?
short——短整型【其规正写法:short int】
int——整形
有了int,为什么还会有short int呢?
相关的long是长整形,long long更长的整形又有什么意义呢?
从表面意思理解的话,short比int短,long比int长,long long 比long长。
如:
#include<stdio.h>
int main(){
long num=100;
printf("%d\n",num);
return 0;
}
其实,在调试结果中屏幕显示的内容是一样的,都是整形;真正有区别的是在空间上的差异。
在举例:
浮点数——
#include<stdio.h>
int main(){
double d=3.14;
printf("%lf\n",d);
return 0;
}
【注:在这里可以用“%f”来表示,但不规范,建议用“%lf”。】
#include<stdio.h>
int main(){
float f=5.0;
printf("%f\n",f);
return 0;
}
【注:在调试窗口上小数点后面的数有6个0表示,如输入3.14,则会显示3.140000;若5.0,则为5.000000;但如果超出,则会以编译器提供的最终结果显示。】
扩展:(不同类型打印出来的数是用百分之几来表示)
%d——打印整形
%c——打印字符
%f——打印浮点数字(即打印小数)
%p——以地址的形式打印
%x——打印十六进制
%lf——打印双精度浮点数
%o——打印八进制
.......
(了解即可,基本不会用到)
回到最初的问题上为什么会出现整形、短整型、长整形呢?
一个整形有多个写法,有什么意义?单/双精度浮点数也一样?
1.不同的数据类型所表示的数值范围不同
2.对应数值类型会减少内存消耗
3.所占的内存空间不同
提一点:
通过不同类型来创建变量,而创建变量是向内存申请空间;那么,所申请的是多大的空间呢?
这里我们通过sizeof函数来计算。
#include<stdio.h>
int main(){
printf("%d\n",sizeof());
return 0;
}
若在sizeof()括号中输入(char)或(int)表示这些数据向内存申请多大的空间。
sizeof——......的大小
其结果:
sizeof(char)——1
sizeof(short)——2
sizeof(int)——4
sizeof(long)——4\8
sizeof(long long)——8
sizeof(float)——4
sizeof(double)——8
这里空间单位是字节(byte)
扩充:
计算机中单位 :
bit——比特
byte——字节
kb
mb
gb
tb
pb
...
计算机最小的单位是bit(比特位)。
原理:
计算机是由硬件组成,而硬件是要通电的,又因电有正电和负电之分,且电信号在计算机中要转换为数字信号,所以正电转换为“1”;负电转换为“0”。
计算机能识别电信号,同样的也能识别“1”和“0”的指令;那既然计算机能识别这些“0”“1”指令,所以就需要将它们存储起来。
那如何存呢?
假设计算机要存一个二进制位“1”,就要为“1”开辟一块空间(只能存“1”),而这空间大小就被称作一个比特位。
一个比特位只能存放一个“1”或“0”。(即一个二进制位)
扩展:
什么是二进制?
进制这一概念在生活中运用最多的是十进制。
十进制——0、1、2、3、4、5、6、7、8、9
二进制——0、1
八进制——0、1、2、3、4、5、6、7
......
生活中还有12进制(比如时间是以12小时为一个周期)
7进制(比如:一星期为7天,之后在时一个周期,如此反复)
生活中任何一个数字(如:123、321、231......)都是由十进制组成的。
十进制这些数字(0、1、2、3、4、5、6、7、8、9)如果组合在一起。能够产生一些十进制的数、以及更大的数。
二进制里面所有数字都是由0、1组成的。
比特位用来存放二进制位,且是一对一存放。
一个字节等于8个比特位。(规定好的)
能够存放8个比特位的空间叫一个字节。
再往下:
1kb=1024byte
1mb=1024kb
1gb=1024mb
1tb=1024gb
1pb=1024tb
十进制的运算:逢十进一
如:7+8=15
因为15>10,就进1且在十进制范围内,所以15是由1和5组成的。
123是十进制数字,然是怎么组成的?
1(百位)2(十位)3(个位)
所以其算法为:1×10²+2×10¹+3×10º=123
二进制的运算:逢二进一
0000000000000000
+1
0000000000000001
+1
0000000000000010
+1
0000000000000011
+1
0000000000000100
(因为二进制只有“0”“1”两位,所以加1后,其结果是余0进一)
.......
如此反复,其最终结果为全1
1111111111111111
再推论:假设有3个比特位,那么就有
000、001、010、011、100、101、110、111——2³种可能
再假设16个比特位存放的二进制数,就有2的16次方可能。(十进制后有2的16次方种数字)
这里就涉及到二进制转换十进制的算法了。
如:010——二进制位
转换十进制就为:0×2²+1×2¹+0×2º=0+2+0+2
以此类推,每一个按照这样算法算下去的二进制序列都可以算作一个数字。
所以,有多少中可能的二进制数就能表达同样可能的数字。
类似的:
int——4byte——32bit
可能有2的32次方种不同排列(递进有规则的)或数字。
而int所能表示的数字最小(min)为0;最大(max)为2的32次方减1
在观察会发现 2的32次方>2的16次方
所以,int表示数字的范围比short大。
回到最初的问题上——一个整形会有长短之分呢?(类似的同样)
举例:如果我们想要表示一个人的年龄——如:age=20;
那这个20是否可能是2000000或20000000呢?(在计算机中理解方式是不一样的)
明显不可能。
这时,就要给age一个范围——int age;而int是整形,且int——4个byte=32bit;因此,所表示数字就很大了。
用超大的空间来存放age的话,就明显浪费了。
所以在int前加上short——short int(短整型)
short——2byte=16bit
所表示数字最大值为2的16次方-1=65535(也还好)
这样的话用short比用int来表示age来说更加合理,更加节省空间。【相较而言,能用最少的空间来表达是更好的】
所以,这就是我们每一种数据类型为什么细化的原因。
【注:存放这么多1的类型,其实是为了更加丰富的表达生活中各种值。】
最后归纳一点为——节省内存空间。
回顾:
short age=20;//这里我们知道short类型是向内存申请2个字节=16bit的空间,并命名为age,用来存放20这个数字。
但有个新问题:
float weight=95.6;(95.6f)//这里是向内存申请4个字节,用来存放小数。
但这种写法会出现一种问题,有时候在编译的时候会出现一些警告。
按Ctrl+Fn+F7或F7快捷键,会出现从“double”到“float”截断,什么意思呢?
这是因为写出95.6这样的类型,编译器会默认会是double类型的,而要把一个double类型的小数放到float类型里面去,这时会放生精度的丢失。
但是,问题不大。
解决方法是直接在小数后加个“f”即可。(加f则表示为单精度浮点数。)
【注:但如果去试着打印时会将精度给粗化,即无限接近。(可自己去尝试)】
插曲:
long类型为什么会有4或8个字节呢?
这又涉及到C语言标准这方面的知识了,C语言标准规定sizeof(long)≥sizeof(int)【只要long大于int即可,并不规定大小是几。】
所以,在vs中,long是4byte,而在一些编译器里,long算出来是8byte;而这些是满足条件。
这些取决于平台的不同。