![](https://i-blog.csdnimg.cn/blog_migrate/cb7cd21f27097ec2e3ba23a2c0f5e502.png)
一.数据的表现形式
数据有两种表现形式:常量和变量
-
常量
<1>定义:在程序运行过程中,其值不能发生改变的量,常量就是数学中的常数, 在程序中有int a =100;float b=123.4; 其中100和123.4就是常量.
<2>常用的常量有以下几种:
1.整型常量:如10010,1234,0,-123等都是整型常量
2.实型常量:十进制小数形式(例如:123.3)和指数形式(例如:12.34e3),由于计算机输出时无法表示上角和下角,则规定用e或E表示以10为底的指数,其中e或E前面必须要有数字,后面必须为整数
3.字符常量:
<1>普通字符:用但撇号引起来的字符,如'a' 'D' '3' '#'不能为'ab' '12',但撇号内只能为 一个字符,字符常量在计算机储存中是以ASCLL码的二进制形式储存
<2>转义字符:以"\"开头的,意思是将"\"后面的字符转换成另外的意思,如\n中的n并不代表n,而转换换另外一种意思为"换行"符
4.字符串常量:用双撇号将多个字符括起来,字符串常量时双撇号内的所有字符,不包括双撇号本身(例如:"ASD",代表字符串ASD)
5.符号常量:用#define指令 例如 #define PI 3.14,表示从此行开始,所有的PI都会被替换成3.14,这个句末是没有分号的,符号常量不占内存,在预编译后这个符号就不存在了.
-
变量
<1>.定义:变量代表一个有名字的,具体特定属性的一个存储单元,他用来存放数据,也就是存放变量的值,在程序运行过程中,变量的值是可以改变的
<2>说明:变量必须新定义后使用,定义变量时要指定变量的类型和名字(例如:int a; a = 12;其中a代表变量名,12代表变量值),变量名实际上是以一个名字代表的一个储存单元,在对程序编译链接时,编辑器会给每个变量名分配一个内存地址;从变量中取值实际上是通过变量名找到相应的内存地址,从该储存单元中读取数据.
3.常变量
<1>.定义:在定义变量时,前面加一个关键字const(例如:const int a =3;),定义为a的变量,在变量存在期间,其值不能发生改变.
<2>常变量和变量之间的异同:常变量具有变量的基本属性,有类型,占存储单元,只是不允许改变其值.
<3>常变量和符号常量(define)的区别
#define PI 3.1 //字符常量
const int PI = 3.14;//常变量
<1>字符常量在预编译时只进行字符替换,在预编译后字符常量就不存在了(全置换为3.14),对符号常量的名字是不分配存储单元的,而常变量是要分配存储空间的.
[补充]标识符
命名规则:只能由数字,字母,下划线组成,且只能由字母或下划线开头,标识符不能为c语言的关键字,并且区分大小写.
二.数据类型
在定义变量时一定要指名变量的类型,常量也是区分类型的,数据是存放在储存单元中的,储存单元是由有限个字节构成,每一个储存单元中存储的数据范围都是有限的;所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(占多少个字节)以及数据的储存形式,不同的类型分配不同的长度和储存形式
-
整型数据
<1>基本整形(int)
(1)一般占两个或4个字节(32位)(由编辑器决定),一个字节为8个二进制数,就是八位
(2)存储单元中的存储方式:一般为整数的补码的形式存放,一个正数的补码是其二进制形式,负数的补码是其二进制形式取反再加1(下一篇介绍原码补码反码)
(3)格式占位:%d
<2>短整型(short int)
(1)类型名为short int 或 short 一般分配2个字节(16位)
(2)存储方式:与int相同,两个字节取值范围为-32768~32767
(3)格式占位:%hd
<3>长整型(long int)
(1)类型名为:long int 或long,一般分配4个字节(32位)
(2)格式占位:%ld
<4>双长整型(long long int)
(1)类型名:long long int或long long,一般分配8个字节(64位),这是c99新增的类型,但许多c语言 编译系统并未实现
[补充].存储单元长度
c标准要求:sizeof(short)<=sizeof(int)<=sizeof(long)<=sizeof(long long),sizeof()是测量类型或变量长度的运算符(求字节运算符)
-
整型变量的符号属性
变量值在存储单元中都是以补码的形式储存,存储单元中的第一个二进位制代表符号,整型变量值的范围包括负数到正数,一般有符号的为[-a,a],则无符号的为[0,2a]
![](https://i-blog.csdnimg.cn/blog_migrate/643ddae391cf1ffcad83037582cfebc8.png)
<1>unsigned修饰符
(1)为了充分利用变量的范围,可以将变量定义为无符号型,可以在数据类型前面加上修饰符unsigned,指定表示该变量是"无符号整数",如果加上signed则表示有符号类型,(符号指的是负号),如果没有修饰符则默认为signed(例如signed int a等价于 int a),如果指定为unsigned则储存单元中全部二进制位都为都用做存放数值本身,而没有符号,无符号型变量不能存放负数
<2>signed修饰符
(1)有符号修饰符整形数据在存储单元中最高位代表数值的符号(0为正,1为负),其他位用做存放变量值
例如:有符号字符型(char 一个字节八位)取值范围是-128-127是因为有符号字符型最高位是符号位,0代表正数;1代表负数。有符号字符型的最大值为01111111,这个二进制值等于2^0+2^1+2^2+2^3+2^4+2^5+2^6=127。无符号的则最大值为11111111,为255
[说明]:
(1).只有整形数据(包括字符型)可以加signed和unsigned修饰符,实型数据(浮点数)不能加
(2).符号占位符:%u
(3).不能给unsigned修饰的变量赋负值,否则会出错
例如:
unsigned short a =-1;
printf("%d",a);
/*
先将a的补码写出来为 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ,存到a里(参考源码反码的转换)
由于a是无符号型,最高位也代表数值位,则转换为十进制输出位65535
*/
3.字符型数据
由于字符是按其代码(整形)形式存储,因此c99把字符数据作为整数类型的一种,但字符数据在使用中有自己的特点
字符与字符代码
<1>字符和字符代码并不是任意写的一个字符,程序都能识别,都是系统的字符集,目前大多数系统使用的是ASCLL字符集,基本都包含127个字符
-
字母:a-z A-Z
-
数字:0-9
-
专门符号:29个,包括! " & ' ( ) * + , - / : ; < = > ? [ \ ] ^ _ ` { | } ~
-
空格符:空格,tab,垂直制表符,换行,换页
-
不能显示的符号:空(null)字符(以'\0'表示),警告(\a),退格(\b),回车(\r)
[说明]:ASCLL码最大为127(有的系统扩展了128-255位),可以用7个二进制数表示(ASCLL为127时,二进制为1111111,7位全1),所以在c语言中,指定用一个字节(8位)储存一个字符,字节中的第一位置为0
[例] 整数1和字符'1'是不同的概念,字符'1'只代表一个形状为'1'的字符,占一个字节,在需要时按原样输出,在内存中以ASCLL码形式储存,而整数1是以整形的方式存储,以二进制补码的形式存储,占2个或4个字节
![](https://i-blog.csdnimg.cn/blog_migrate/34bcfc27c33ed18b4608777314860a5d.jpeg)
字符变量
字符变量是用类型符char定义字符变量,例如 char a = 'c';意思为定义一个字符型变量a并且给他赋值'c',字符用单引号
<1> char a = 'c',a是字符变量,实质上是一个字节的整形变量,它一般用来存储字符,所以称字符变量,但可以把0-127之间的整数赋值给一个字符变量
printf("%d,%c",'a','a');
//将一个字符a以十进制整数输出和字符型输出
//%c表示的是字符占位符,以字符的形式输出
//以整数输出,对应ASCLL码的数字,a对应的ASCLL码为65码
//输出结果为:65,a
<2>字符变量在内存中的存储
将其对应的ASCLL码转化为二进制形式储存
例如:字符'i'的ASCLL码为49,因为字符对应的ASCLL码都为整数,他的补码即为他的二进制数,在 内存中存储对应的二进制为 0011 0001(1个字节)
<3>字符型数据的存储空间及其取值范围
![](https://i-blog.csdnimg.cn/blog_migrate/e10a3a3c977695a7cabdf41a1168b635.png)
[说明]
在使用有符号字符型变量时,允许存储的值为-127~128,但字符的代码不能为负,则实际只用到了0~127这一部分
浮点型数据
浮点型数据是用来表示具有小数的实数,在c语言中,实数是以指数的形式存放在存储单元中的
因为小数点位置可以变化()浮动,进而指数增减,所以称为浮点数
<1>浮点型:float(单精度浮点数),double(双精度浮点数),long double(长双精度浮点数)
<2>float型:占4个字节(32位),数值以规范的二进制数指数形式存放在存储单元中,存储时,将实型分成小数和指数两部分分别存储,小数部分的小数点前的数为0
-
符号位(Sign) : 0代表正,1代表为负
-
指数位(Exponent): 用于存储科学计数法中的指数数据,并且采用移位存储
-
尾数部分(Mantissa):小数部分
![](https://i-blog.csdnimg.cn/blog_migrate/0b208b30324be1f11d0d3c8f8a7baf7a.png)
<3>占位符:%f
<4>float型数据能精确到小数点后6位
<5>double型:为了扩大数据的范围,用8个字节储存double型,可得到15位有效数字,为了提高运算精度,c语言在运算中,将float型自动转化位double型
[说明]
C语言中,输出double类型(双精度实型)以及float类型(单精度实型)时,默认输出6位小数(不足六位以0补齐,超过六位按四舍五入截断)。
如果想小数点后面16位,写成%.16lf,不会自动四舍五入的,double是一个近似值,通常没有办法做的很精确。通常能精确到小数点后面5,6位,也就是说超过5,6位了可能就不准了
<6>浮点型常量:凡是以小数或指数形式出现的实数均为浮点型常量,在内存中都以指数形式存在,并且c编辑器把浮点数都按double类型处理,分配8个字节
float a =3.1415//系统按double处理
float b =3.1344f//系统按单精度处理
注意:每个变量都有一个确定的类型,变量是占内存的,是具体的实体,在其占用的存储单元中是可以存放数据的,而类型是抽象的,不占储存单元,不能用来存放数据
int a; a = 3;//正确,a是存储数据的int型变量
int a =3//错误,不能对类型进行赋值,因为不占用内存空间