今天又是早起的一天。
上午:
开始读单词
学习内容:
# 第二天
## 1. 常量
### 1.1常量概念
程序运行时,其不能改变的量,即为常量
### 1.2 常量分类
* 字面常量(直接量常量),如23,13;
* 标识符常量(C99标准后增加)
### 1.3标识符常量的定义方式
* ①宏定义: #define 常量名 常量值
~~~c
//如下
#define MAX 100
~~~
* ②const 关键字: const 常量名 常量值
~~~
//如下
const int MIN = 10;
int const DAY = 515;
~~~
### 1.4 两种方式的区别
* ①类型检查 :宏定义不会类型检查,const关键字在编译的时候进行文本检查
* ② 执行时间:宏定义在预处理阶段进行文本替换,即将程序中的常量名换成常量值。const关键字定义的常量在执行阶段被创建并进入内存
## 2.二进制
### 2.1 进制
#### ①常见进制
* 二进制
* 八进制(不常见)
* 十进制
* 十六进制
#### ② 不同进制表示的字面常量整数
* 十进制字面量:默认
* 二进制字面量:0b开头
* 十六进制字面量:0x
### 2.2 进制转换
#### ①二进制和十进制
##### 2的次方数(重要,必背)
~~~
2^1 = 1
2^2 = 2
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
~~~
##### 二进制转十进制
~~~
标准规则: 从最低位开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
8421规则:只考虑1忽略0,1后面几个数就对应2的几次方
如: 1011 = 2^3+0x2^2+1x2^1+1x2^0=11
~~~
##### 十进制转二进制
~~~
标准规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
8421技巧:使用2的次方数去凑
如: 11 = 2^3+0x2^2+1x2^1+1x2^0=1011
~~~
#### ②十六进制转十进制(了解)
##### 十六进制转十进制
~~~
规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
~~~
##### 十进制转换为十六进制
~~~
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
~~~
### 2.3 源码、反码、补码
~~~
正数和0: 原码、反码、补码都相同
负数: 原码:对应的二进制数,符号位是1
反码:原码基础上,符号位不变,其他位取反
补码:反码基础上加1
~~~
[补码计算器:](https://www.lddgo.net/convert/number-binary-code)
## 3.数据类型
> **比特:** bit,简称b,计算机中最小存储单位,表示一个二进制位。
>
> **字节:** byte,简称B,计算机种基本存储单位,8个比特表示一个字节。
#### 3.1整数的划分
##### ①整形划分
####
| 类型 | 类型简写 | 说明 | 存储大小 |
| ---------------------- | ------------------ | -------------- | -------- |
| signed int | int、signed | 有符号整型 | 4字节 |
| unsigned int | unsigned | 无符号整型 | 4字节 |
| signed short int | short | 有符号短整型 | 2字节 |
| unsigned short int | unsigned short | 无符号短整型 | 2字节 |
| signed long int | long | 有符号长整型 | 4或8字节 |
| unsigned long int | unsigned long | 无符号长整型 | 4或8字节 |
| signed long long int | long long | 有符号长长整型 | 8字节 |
| unsigned long long int | unsigned long long | 无符号长长整型 | 8字节 |
> **总结:**
>
> ① 整型分为四种:int、short、long、long long; 每一种分为 signed和unsigned两种。
>
> ② 需要表示整数的时候首选 int 类型,如果超出范围,再使用 long 或 long long。
>
> ③ long long 类型为 C99 标准增加。
##### ②字面量后缀(不需要记)
| 数据类型 | 字面量后缀 | 数据类型 | 字面量后缀 |
| --------- | ---------- | ------------------ | ---------- |
| int | 不需要 | unsigned int | U |
| long | L | unsigned long | UL |
| long long | LL | unsigned long long | ULL |
> **注意:**
>
> ① L 和 U 的可以任意组合,UL 等价于LU,ULL等价于LLU
>
> ② 字面量后缀不区分大小写,l 等同于 L
##### ③ 格式占位符
| 数据类型 | 格式占位符 | 数据类型 | 格式占位符 |
| --------- | ---------- | ------------------ | ---------- |
| int | %d | unsigned int | %u |
| short | %hd | unsigned short | %hu |
| long | %ld | unsigned long | %lu |
| long long | %lld | unsigned long long | %llu |
##### ④ 等宽整数类型
定义在标准库头文件 `<stdint.h>` 中:
```
int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t
```
注意: 使用库文件定义整形所占位数时,移植程序时,自动匹配该操作系统中对应位数的整数类型
#### 3.浮点类型
##### ①浮点类型划分
| 数据类型 | 说明 | 存储长度 | 有效小数位数 |
| ----------- | ---------------- | -------------- | ------------ |
| float | 单精度浮点类型 | 4字节 | 6~9 |
| double | 双精度浮点类型 | 8字节 | 15~18 |
| long double | 长双精度浮点类型 | 10字节或16字节 | 18以上 |
> **总结:**
>
> ① 首选类型是 double,如果需要更高的精度可以使用 long double
>
> ② 浮点的直接量表示可以写十进制小数,如`2.45`、`0.89`;也可以写科学计数法,如 `8.9E4`、`7.8976e3`。
>
> ③ long double 类型 为 C99 标准增加。
>
##### ②字面量后缀(不需要记)
| 类型 | 字面量后缀 |
| ----------- | ---------- |
| float | F、f |
| double | 不需要 |
| long double | L、l |
> **注意:**字面量后缀不区分大小写
##### ③格式站位符
> | 数据类型 | 十进制小数形式对应的占位符 | 科学计数法形式对应的占位符 |
> | ----------- | -------------------------- | -------------------------- |
> | float | %f | %e |
> | double | %lf、%f | %le |
> | long double | %Lf | %Le |
>
> > **注意:**
> >
> > 输出double类型数据,可以使用 %f 或 %lf; scanf()获取double类型数据,只能使用 %lf。
##### ④浮点类型存储原理
~~~
4.5 * 10^3
4.5 是位数
10 是基数
3 是指数
~~~
存储方式:浮点数分为符号位、指数部分、尾数部分三部分存储
作业:
1. 以下二进制表示的数字转为十进制
100101
1011001
11001
1000110
11110
100000101
110010011
111000001
2. 以下十进制数字转为二进制数字
89
65
130
27
72
110
53
223
3. 以下二进制数字转为十六进制数字
10010100
10110010
11001101
10100110
10111110
1011001
1100110010
11000010010
4. 以下十六进制数字转为二进制数字
AD
F29
9D
160
DDD
F1
6D
19
5. 计算以下数字的原码、反码、补码(使用8个二进制位表示)
100
-89
-2
-128
127
-10
0
-100
6. 定义一个有符号整数变量,赋值一个负数,使用 %d 和 %u 分别输出会得到什么结果
%d 直接输出负数
%u 即unsigned int,其中int为四字节,即32位,将负数转化为32位的二进制数,再转为十进制数字
遇到的问题解析:负数转码时没有补全八个位,%u输出时,可将负数转码为补码,然后把符号位1,当成二进制位数,转化为十进制数
简书一天只能发两篇文章,头图