day 1
数据类型
给数据分类
C中数据结构
基本类型
C语言已经定义好的
整型
singed char/unsigned char //字符型 1字节
singed int/unsigned int //整型 4字节
singed short/unsigned short //短整型 2字节
singed long int/unsinged long int // 长整型 4字节 不固定,不同环境不同大小
浮点型
float 单精度浮点数 4字节
double 双精度浮点数 8字节
long double 16字节
构造类型
自定义类型
数组
结构体
枚举
共用体
指针类型
void类型
三个地方
1.void作为函数的参数,表示函数没有参数
2.作为函数的返回值,表示没有返回值
3.void * 作为通用指针
变量和常量
定义数据对象:
变量 可变
常量 不可变
变量的定义
数据类型 变量名{=初值}
数据类型 变量类型,系统自动分配空间
变量名 命名规则:以字母或下划线开头,只包含数据、字母、下划线
初始值 不指定初始值,变量会有一个值,可能是0,可能随机
分配空间,一定有值,bit要么是0要么是1,分配了空间,继承原有空间的电容,内部就有值
变量的属性
1.变量的名字
程序运行时,代表变量
2.变量的类型
决定系统分配的变量的空间大小
3.变量的值
int a = 250;
存储单元, 系统会为每一个存储单元分配(以字节为单位)一个唯一的编号
变量有两个值,一个是本身的值(右值, 可变),一个是系统分配的地址也就是编号(左值, 不变)
在C语言中,任何变量都有左值和右值
变量的操作
read 读一个变量的值
write 把一个值写入对应存储单元
例如:
int a,b;
a = 5;
b = a;
a = 5;//a的写操作,把5写入a的地址中
b =a ;//a的读操作,把a的值拿出来,写入b
整数在计算机中的存储形式
整数在计算机中是以二进制的补码存放
- 补码
- 非负整数, 补码就是原码
- 负整数, 绝对值的原码的补码,按位取反,末位加一
计算机中存储 1111 1101
如果是 char类型,它就是-3
如果是 unsigned char 他就是 253
对于 signed 和unsigned 的区别就是数据的最高位是不是符号位
最高位为1 代表是负数
最高位为0 代表是非负数
非十进制的加减问题
对于nbit的数据x(x为正数)
-x 和 2n-x在计算机中的存储形式是一样的
char 类型的整数的取值范围 -27- 27 - 1
10000000表示-128,1代表符号位,-0无意义,-1为11111111,一直递减,到10000000,此时定义为-128
一段8bit的空间可以保存的整数取值范围为-128 - 255
char a = 255;//把255写入到a的存储单元中,a的存储单元为8个1 所以a的值就是-1
printf函数
功能 向终端输出
使用printf必须包含头文件<stdio.h>
printf(const char * farmat,...);
printf("格式化字符串",输出列表);
格式化字符串中的内容:
1.可以是任意的字符,英文,中文,符号
2.格式化控制字符
% + 字符组成
%d: 将后面的整数,以 int 类型输出
%u: 将后面的整数,以 unsigned int 类型输出
%o: 将后面的整数,以8进制(无符号)输出
%x: 以16进制输出
%c: 以char 类型输出(输出一个字符的形状)
%ld: 以 long int 输出
%lld 以 long long int 输出
%p: 以16进制输出一个地址(数据的左值)
%%: 输出一个%
...
3.转义字符
\ + 字符
\n 输出一个换行
\t 横向跳格
\r 制表
输出到中端的内容:
1.按照格式化字符串里面的内容原样输出
2.输出地址列表里的变量
3.输出对应内容
程序验证
#include <stdio.h>
1.
int main()
{
int a = -3;
printf("%d\n",a); //-3
printf("%u\n",a); //2^32-3
}
2.
int main()
{
unsigned char a = 255;
char b = 255;
printf("%d---%d\n",a,b); //255, -1
解释:将 a看成 32位有符号数据,要拉长,由于a本身是无符号,拉长时补0
a ==> int==> 00000000 00000000 00000000 11111111
将 b看成 32位有符号数据,要拉长,由于b本身无符号的,符号位是1
b ==> int ==> 11111111 11111111 11111111 11111111
}
printf("%u",a): printf 把后面那个a(不管是什么类型),都看成 unsigned int 输出
3.
int main()
{
char a = -1;
int b = a; //把短的数 赋值给长的数
a = b; //把长的数赋值给短的数
// b的值-1,a的值-1
usnigned char c = -1
int d = c;
c = d;
//d的值是 255,c的值 255
}
-3 232-3
255----1
不同类型之间的整数赋值问题
- C语言支持不同类型的整数进行赋值
- 代码中出现的数字都是int类型
长短不一的数据如何赋值
-
长的数据赋值给短的数据
- 低字节直接拷贝,高字节直接丢弃
-
短的数据赋值给长的数据
- 如果短的是有符号位的,高位补符号位,如果是负的,补完1之后,按位取反还是0,不影响数值
- 如果短的是无符号位的,高位补0
对于负数来说,以补码形式存储,按符号位补1,就是对数值补0,对数值不造成影响
int main()
{
char a = -3;// 1111 1101
int b = 1;//00000000 00000000 00000000 00000001
}
问上述 a+b 大于0还是小于0
//a+b = 11111111 11111111 11111111 11111110
//转换为int 型得 -2 故小于0
int main()
{
char a = -3;// 1111 1101
unsigned int b = 1;// 00000000 00000000 00000000 00000001
}
问上述 a+b 大于0还是小于0
//a+b = 11111111 11111111 11111111 11111110
//转换为 unsigned int得2^32 -2+ 故大于0
int main()
{
char a = -3;
unsigned short b = 1;
}
问上述 a+b 大于0还是小于0
//char 和unsigned都低于int型,先做整型提升为int型,-3+1=-2
//故小于0
int main()
{
char c = 255;//1111 1111
char d;
d = c+192;// 192 1100 0000 + 1111 1111 = 1011 1111
printf("%d\n",d);//1111 1111 1111 1111 1111 1111 1011 1111
printf("%u\n",d);//1111 1111 1111 1111 1111 1111 1011 1111
return 0;
}
//c为1111 1111 加上1100 0000得1011 1111,转换为int型为1111 1111 1111 1111 1111 1111 1011 1111
//故输出为-65 2^32-65
192是int型,没定义的数字都是int型,把c提升到intx型,为11111111 111111111 11111111 11111111 加上 00000000 00000000 00000000 11000000 得1111 1111 1111 1111 1111 1111 1011 1111,然后赋值给char 类型的d,得1011 1111
两边运算都低于int型,需要做整型提升到int型进行计算,否则提升为最高类型的数据进行运算
int main()
{
unsigned char a = -3;//11111111 11111111 11111111 1111 1101
}
256-3+1=254
a + 1 = 254
int main()
{
unsigned char c = 250;//1111 1010
char d;
d = c + 9;//0000 1001 =1 0000 0011
3
3
}
常量
在程序运行中,不能改变的量
常量的形式
整型常量
十进制常量
1,2,3......
八进制常量
0[0-7]+ : 0开头,后面接若干个0-7之间的数字
八进制和二进制对应
一个八进制数对应三个二进制数
十六进制常量
0[Xx][0-9][A-F][a-f]+ :以0X 或0x开头,后面接若干0-9 or A-F or a-f
字符常量
'', 单引号引起来的一个或者多个字符的序列,用来表示一个字符常量
ASCII码保存字符的值
'\000':
由\后面接一个、两个、三个这样的八进制数,可以用来代表所期望的字符的ASCII码
'\x000'
由\x后面接一个、两个这样的十六进制数,可以用来代表所期望的字符的ASCII码
char a = 58;
char a = ':';
char a = 072;
char a = 0x3a;
char a = '\072';
char a = '\x3a';
都表示 :
char a = 0;//a的值0
char a = '0';//a的值是48
char a = '\0';//a的值是0
浮点型常量
在计算机中存储方式
浮点型常量由整数部分,小数点,小数部分,一个可选的E/e,一个可选的带符号的整型指数,和一个可选的表示后缀类型的符号(F/f/l)
没有后缀默认double类型