1.c 的数据类型
分类:
基本类型:(其值不可再分)
- 整型
- 字符型
- 浮点型:单精度浮点型和双精度浮点型
- 枚举型
构造类型:(可分成多个“成员”每个成员都是一基本数据类型或又是一个构造类型)
- 结构体类型
- 共用体类型
- 数组类型
指针类型
空类型
2.常量与变量
1)常量:
—直接常量:
- 整型常量:12、0
- 字符型常量:4.6、-1.3
- 字符常量:‘a’、‘b’、‘3’
—符号常量
用标识符表示常量
形式:#define 标识符 常量 如:#define PI 3.1415926
—符号常量在使用前必须先定义
—习惯上,约定符号常量名大写,变量名用小写
2)变量:
变量:代表内存中具有特点属性的一个存储单元,用来存储数据
- 变量必须先定义后使用
标识符:对变量、符号常量、函数、数组等数据对象命名的有效符号序列
标识符命名规则:c语言规定标识符只能对字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线(一定不要用 c 语言的关键字)
3.整型数据
<1> 整型常量表示方法:
1)十进制:如123、0、4
2)八进制,以“0”<零>开头。如:0123
3)十六进制:以“0x”开头。如:0x123
<2> 整型变量:
1)内存中的存放形式(补码)
以二进制形式存放
在内存中,数值是以补码的形式表示的。
正数的补码、反码和其原码形式相同
负数的补码:将该负数的绝对值的二进制,按位取反再加1.
如:-10的补码
-10的绝对值的原码: 00000000 00001010 原码
取反: 11111111 11110101 反码
再加1,得-10的补码: 11111111 11110110 补码
注:在其存储单元中,最左边的一位是符号位。0:正数 1:负数
1的原码: 00000000 00000000
-1的补码: 11111111 11111111
32767的原码: 01111111 11111111
-32767的补码: 10000000 00000001
-32768的补码: 10000000 00000000
2)整型变量的风类
类型说明符 | 数的范围 | 字节数 | |
基本型 | int(16位) | -32768~32767 | 2 |
无符号基本型 | unsigned [int] | 0~65535(2的16次方减1) | 2 |
短整型 | short | -32768~32767 | 2 |
无符号短整型 | unsigned short [int] | 0~65535 | 2 |
长整形 | long(32位) | -2的31次方~~2的31次方减1 | 4 |
无符号长整形 | unsigned long [int] | 0~~2的32次方减1 | 4 |
3)整型变量的定义
形式:类型说明符 变量名标识符,变量名标识符,......;
注意:允许在一个类型说明符后加多个变量名,但各个变量名之间必须加逗号间隔。以“ ;”结尾
4)整型变量的溢出
/*整形变量的溢出*/
void main()
{
int a,b;
a=32767;
b=a=1;
printf("%d%d",a,b);
}
/*计算过程:
a的值: 01111111 11111111 32767的补码
x 1
--------------------
b的值: 10000000 00000000 -32768的补码
*/
4.浮点型数据
<1> 浮点型的常量
1)十进制小数形式
数字+小数点(必须有小数点) 如:123. 、 123.0、.123、0.0
2) 指数形式:数字+e+整数(e+整数,整数为10的指数) 如:123e3=123*10³
注:字母e之前必须有数字,e之后必须是整数
<2> 浮点型的变量
1)内存中的存放形式
一般占4个字节,内存中按指数形式储存。一般编译系统用24位表示小数部分(包括符号),8位表示指数部分。
ANSI编码中,中文字符占2字节 1字节(B)=8bit(位)
2)浮点型变量的分类
单精度(float) 32位 4字节
双精度(double) 64位 8字节
长双精度型(long double) 128位 16字节
3)浮点型数据的舍入误差
搞不懂 >.<
/*
由于实型变量是用有限的存储空间存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,因此会产生误差。
*/
void main()
{
float a,b;
a=123456.789e5;
b=a+20;
printf("%f\n,%f\n",a,b);
}
/*
理论结果:
a=123456.78900
b=123456.78920
实际运行结果:
a=12345678848.000000
b=12345678848.000000
原因:float只能保证的有效数字是7位,7位以后的数字无意义
*/
/*
将float型换为double型,输出结果和理论结果相同
因为double型有效位为16位
*/
注意:应该避免将一个很大的数和一个很小的数直接相加或相减,否则就会"丢失"小的数。
5.字符型数据
<1> 字符常量(占1字节)
1)用单引号包含的一个字符是字符常量
如:'a'、'A'、'#'、'4'、' '
2)说明:
'a'和'A'是不同的字符常量
字符常量只能用单引号括起来
字符常量只能是单个字符
3)ASCII码
控制字符 | ASCII码 | 控制字符 | ASCII码 |
'0' | 48 | '1' | 49 |
'A' | 65 | 'a' | 97 |
4)转义字符:以“ \ ”开头的特殊字符
\n 换行 ASCII码:10
\t 水平制表(8位为一个tab位置) ASCII码:9
\b 退格,将当前位置移到前一列 ASCII码:8
\r 回车,将当前位置移到本行开头 ASCII码:13
\f 换页,将当前位置移到下页开头 ASCII码:12
\\ 反斜杠字符 ASCII码:92
\‘ 单撇号字符 ASCII码:39
\“ 双撇号字符 ASCII码:34
注意:除了‘\r’外,其余转义字符的跳格会取代原来屏幕上该位置显示的字符
<2> 字符变量
用来存放字符常量,但只能存放一个字符
形式:char 字符型变量 ,字符型变量,......;
<3> 字符数据在内存中的存储形式及其使用方法
1)将一个字符放到一个字符变量中,在内存单元中,是将该字符的相应的ASCII代码放人存储单元中。
如'a'的ASCII代码为97
97 ——> 01100001
示意图 实际存储图
效果:字符数据以ASCII码存储,与整数的存储形式类似
一个字符数据既可以以字符形式输出,也可以以整数形式输出
void main()
{
char c1,c2;
c1=97,c2='a';
print("%c %c\n",c1,c2);
print("%d %d",c1,c2);
}
/*
输出结果:
a a
97 97
*/
<4> 字符串常量
定义:字符串是一对双引号括起来的字符序列 如:"chengdian252"、"CSDN"
C 规定:在每一个字符串的结尾加一个“字符串结束标志”——“\0”,以便判断字符串是否结束
在内存中:字符串+\0
书写时:不必加“\0”,系统默认加了
注意:字符串所占的内存空间为字节数加1.