计算机中数据的处理
计算机能处理的数据分为两大类:数值型数据 非数值型数据
数值型数据的表示方式
2.1 十进制/D
特点:逢10进1 每一位上的数字范围 [0-9]
前导符:没有前导符
例如:100 1234
2.2 二进制/B
特点:逢2进1 每一位上的数字只能是 0 或者 1
前导符:0b
例如:0b1010001 0b1011
二进制转十进制:
0b11101 --> 从右向左 1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4
== 1 + 0 + 4 + 8 + 16
== 29
注意:其他任何进制转10进制都可以使用这种方式,只不过将底数的2 换成对应进制的数字即可,如果熟练可以使用 8421转换 ,8421指的是每一位上1的权重:
0001 -->1
0010 -->2
0100 -->4
1000 -->8
十进制转二进制:
使用辗转相除法(除2取余法)
使用十进制的数据除以2,保留商和余数,然后用商继续除以2,再保留商和余数,依次类推,直到商为0时结束。将得到的余数反向取出,就是对应的二进制数了。
以十进制的29转二进制位例:
2.3 八进制/O
特点:逢8进1 每一位上的数字范围 [0, 7]
前导符:0
例如:0345 0556
八进制转二进制:
方式1:八转十 然后 十转二
方式2:1位八进制对应3位二进制
0357 ---> 0b011101111
二进制转八进制:
从右向左 每3位二进制对应1位八进制,高位不够 补0
0b011010101 ---> 0325
2.4 十六进制/H
特点:逢16进1 每一位上的数字范围 [0, 9] a:10 b:11 c:12 d:13 e:14 f:15
前导符:0x
例如:0xAB12 0x78EF
十六进制转二进制:
方式1:十六转十 然后 十转二
方式2:1位十六进制对应4位二进制
0x78EF ---> 0b0111100011101111
二进制转十六进制:
从右向左 每4位二进制对应1位十六进制,高位不够 补0
0b0001110101010011 ---> 0x1D53
注意:不管几进制的数据,在计算机中都会转换成二进制处理。
例:
int 是数据类型是用来定义变量的,a 是变量名,是自己起的名字
int a = 100; //用十进制的100 给变量a赋值
printf("a = %d\n", a); //%d是十进制的占位符 表示将后面的数据按十进制输出
printf("a = %#o\n", a); //%o是八进制的占位符 # 表示输出前导符
printf("a = %#x\n", a); //%x是十六进制的占位符 # 表示输出前导符
printf 函数没有输出二进制的能力
int b = 0b1010110; //用二进制的数据给变量赋值
printf("b = %d b = %#o b = %#x\n", b, b, b);
int c = 0567; //用八进制的数据给变量赋值
printf("c = %d c = %#o c = %#x\n", c, c, c);
int d = 0xAB12; //用十六进制的数据给变量赋值
printf("d = %d d = %#o d = %#x\n", d, d, d);
执行结果:
非数值型数据的表示形式
计算机中只能处理二进制的数值型数据,但是实际编程的过程中,也经常会遇到跟多非数值型数据,如人名、企业名、网址等:
"www.baidu.com" "zhangsan" "4399" 'M'
(非数值型数据都是用 单引号或者双引号引起来的)
计算机也需要处理这些非数值型数据,因此需要 ascii ,使用 man ascii 就可以查看ascii码表,按 q 退出,ascii其实就是规定了字符和整数对应的关系,每个字符都有一个对应的整数,叫做该字符的ascii码,实际使用字符的时候,本质上使用的都是该字符对应的ascii码。
常见字符对应的ascii码
'A' ~ 'Z' : 65~90
'a' ~ 'z' : 97~122
'0' ~ '9' : 48~57
'\0' : 0
'\n' : 10
转义字符:
所有字符都可以使用 '\+数字(八进制)' 来表示
除此之外,C语言中还定义一些 '\+字母' 来表示那些无法显示的字符
如 '\n' '\0' '\a' ..
这些就叫做转义字符,因为这些符号已经不是字母本身的含义了。
词法符号
4.1 关键字
所谓的关键字就是编译器中已经规定好的一些有特殊含义的单词,直接使用即可。
C语言是严格区分大小写的,关键字都是小写的。
4.2 标识符
所谓的标识符就是我们自己起的名字,变量名、函数名、结构体名、共用体名。
命名时要符合标识符的命名规范:
1.只能由数字、字母、下划线组成;
2.不能以数字开头;
3.不能和关键字冲突;
命名是尽量做到“望文知意” 。
数据类型
5.1 C语言的本质
C语言的本质是操作内存。
内存和硬盘区别:
内存:读写速度快 数据掉电丢失 价格贵
硬盘:读写速度慢 数据掉电不丢失 价格便宜
5.2 内存分配的最小单位
字节 Byte。
5.3 数据类型的作用
数据类型的作用相当于模子,决定了由他定义的变量需要操作系统分配多大的内存空间。
5.4 数据类型的分类
基本类型:
字符类型 char %c 1字节
短整型 short %d 2字节
整型 int %d 4字节
长整型 long %ld 32位系统(4字节) 64位系统(8字节)
长长整型 long long %lld 8字节
单精度浮点型 float %f 4字节
双精度浮点型 double %lf 8字节
多精度浮点型 long double %Lf 32位系统(12字节) 64位系统(16字节)
枚举类型 enum
构造类型:
数组 char s[5] int s[10]
结构体 struct
共用体(联合体) union
指针类型:
char *p1
int *p2
int (*p3)[3]
int **p4
大小:32位系统4字节 64位系统8字节
空类型:
void
void *
5.5整数类型
整数类型又可以细分为 char short int long 和 long long 类型
其中每种类型又分为 有符号的(signed) 和 无符号的(unsigned)
不写有无符号时,默认都是有符号的
有符号数 最高位为符号位 符号位为1(负数) 0(正数)
5.5.1 char 字符类型
占用内存空间的大小:1字节 8 bit
能存储的数据范围:
无符号:[0, 2^8-1]
有符号:[-2^7 , 2^7-1]
为了解决正负0的问题,计算机中存储的是数据的补码形式,规定了 10000000 为 -128 的补码,负数比正数多一个,下述类型与之同理。
5.5.2 short 短整型
占用内存空间的大小:2字节 16 bit
能存储的数据范围:
无符号:[0, 2^16-1]
有符号:[-2^15 , 2^15-1]
5.5.3 int 整型
占用内存空间的大小:4字节 32 bit
能存储的数据范围:
无符号:[0, 2^32-1]
有符号:[-2^31 , 2^31-1]
5.5.4 long 长整型
在32位系统中 和 int 一样
在64位系统中 和 long long 一样
5.5.5 long long 长长整型
占用内存空间的大小:8字节 64 bit
能存储的数据范围:
无符号:[0, 2^64-1]
有符号:[-2^63 , 2^63-1]
5.6 浮点型(实型)
就是小数的意思。
float 4字节 单精度浮点型
double 8字节 双进度浮点型
浮点型数据的存储涉及到小数的二进制,比较复杂。
要注意:浮点型存储 存储的是拼凑的近似值
https://blog.csdn.net/weixin_44767670/article/details/118084379?spm=1001.2014.3001.5501
5.7 空类型
void 空类型一般不单独使用,都是配合着指针使用的。
5.8原码、反码、补码转换的问题
数据在存储到计算的过程中,涉及到原码、反码、补码转换的问题;
正数的符号数为0,负数的符号数为1;
原码==给人类看的;
反码==用来转换原码和补码的;
补码==给计算机看的;
无符号数:原码、反码、补码是一样的;
有符号的正数:原码、反码、补码是一样的;
有符号的负数:
反码 == 原码符号位不变,其他位按位取反 (0变1,1变0);
补码 == 反码+1;
规则:存储时看数据(正负),取出时看类型(有无符号)。
常量
6.1 概念
在整个程序运行的过程中,值不允许发生变化的量。
6.2 常量的分类
前导符 输出时占位符 例如
整型常量
十进制 无 %d %u 1314
二进制 0b 无 0b10101
八进制 0 %o 0765
十六进制 0x %x 0x67EF
浮点型常量
float 单精度浮点型 %f
double 双精度浮点型 %lf (小写的L) 3.14
指数常量 就是科学计数法 %e 4.567e2 --> 4.567*10^2
字符常量 %c 'M'
字符串常量 %s "hello"
标识常量 ----宏定义 #define
6.3 整型常量
long 类型输出要用 %ld;
long long 类型输出要用 %lld;
unsigned 类型输出要用 %u %lu %llu。
6.4 浮点型常量
浮点型常量一般都是有小数部分的。
有两种表示形式:
一般形式: 3.14 5.28
指数形式: [+/-]M.Ne[+/-]T ---> 就是科学计数法
-3.4567e3 ---> -3.4567*10^3 ---> -3456.7
2.345e-2 ---> 2.345 * 10 ^ -2 ----> 0.02345
使用浮点型常量给变量赋值:float a = 3.1415926;默认显示6位小数 超过的部分 四舍五入:printf("a = %f\n", a); //3.141593
也可以使用 %.nf 来表示显示 n位小数,n是一个具体的数据:
printf("a = %.2f\n", a); //3.14
double b = 3.1415926;
默认显示6位小数 超过的部分 四舍五入
printf("b = %lf\n", b); //3.141593
也可以使用 %.nlf 来表示显示 n位小数 n是一个具体的数据
printf("b = %.3lf\n", b); //3.142
小数也可以按指数行数输出
6.5字符常量
所谓的字符常量就是前面说的一个非数值型数据,字符常量必须要用单引号 ' ' 引起来,且单引号中只能引一个字符。字符参与运算时 本质就是其对应的ascii参与运算。
'M' 'h' '8' '\n'
字符就是整型,整型就是字符。
6.6字符串常量
字符串是由连续的一个或多个字符组成的,并且必须用 双引号 " " 引起来:
"www.hqyj.com" "zhangsan" "m"
注意:每个字符串结尾都有一个隐藏的字符 '\0' 用来标识字符串结束的
所以, "hello" 占用的内存空间是 6个字节。
在代码中:
a 变量a
'a' 字符a
"a" 字符串a
6.7标识常量--宏定义
宏定义就是给表达式起一个别名,以后想使用这个表达式的时候,使用别名即可,当表达式需要改变的时候,只需要修改定义处即可,就无须修改整个代码了。
格式:
#define 宏名 宏值
注意:宏定义的名字是一个标识符,要符合标识符命名规范,且一般情况下,宏名都大写。
注意事项:
1.宏定义是在预处理阶段完成替换的;
2.宏定义只是一个简单的替换,无脑替换;