第4章 常量
1. 常量特点
程序运行时,其值不能改变的量,即为常量。
习惯上常量名使用大写,方便与变量区分。
2. 常量分类
**字面量常量 **:直接使用的常量,不需要定义或声明,包括整数常量、浮点数常量、字符常量。
注:有 1,2,3等 ——顾名思义,就是数字整数
1.2,1.3,1.4等 ——也就是小数
'a','b','c'等 ——表示的就是字母;而单独写入字母 不加单引号,是不允许的,由于单独字母就是变量了
标识符常量
3. 常量定义方式(标识符常量)
① #define 宏定义 (C98标准) ——#define 必须写在 main 函数的外面(#define 是预处理指令)
格式:#define 常量名 常量值
② const 关键字(C99标准增加)
格式:const 数据类型 常量名 = 常量值; ——const 只要位置在 常量名 前面就可以,eg:可以和 数据类型交换位置
注:1.const可以写在主函数里外都行
2.const适用于C99、是在C99之后产生的,#define是C89
4. 两种定义方式区别
类型检查: const 编译阶段会进行类型检查,#define 方式不会
执行时机: const 在程序执行的时在内存中创建; #define 在预处理阶段进行文本替换
注:两种定义常量的方式,定义后的常量都不允许被修改
第5章 二进制
1. 进制
(1)常见进制
二进制、十进制、十六进制
(2)不同进制的表示
默认十进制
0b开头表示二进制
0x开头表示十六进制
(3) 不同进制输出格式占位符
%d :十进制整数。
%x :十六进制整数。
%#x :显示前缀 0x 的十六进制整数。 ——x的小写
%#X :显示前缀 0X 的十六进制整数。 ——X的大写
2. 进制转换
注:一般进制转换,其他进制 转 十进制 × ,十进制 转 其他进制 ÷
详细说明:
- 其他(几)进制 转 十进制
规则:从最低位开始,将每个位上的数提取出来,乘以 几 的(位数-1)次方,然后求和。
- 十进制 转 其他(几)进制
规则:将该数不断除以 几 ,直到商为0为止,然后将每步得到的余数倒过来,就是对应的 几 进制。
八四二一法: 是一种快速转换数字的方法,主要用于二进制、八进制和十六进制之间的转换。
(1)二进制与十进制之间相互转化
8421公式:
2^0=1
2^1=2
2^2=4
2^3=8
2^4=16
2^5=32
2^6=64
2^7=128
2^8=256
2^9=512
2^10=1024 ——对应凑整
二进制转十进制:
1011=1*2^3 + 0*2^2 + 1*2^1 + 1*2^0
=8+0+2+1
=11
十进制转二进制:(用2的几次方的得数凑整)
57=2^5 + 2^4 + 2^3 + 2^0
=32+16+8+1
=100000+10000+1000+1
=111001
(2)十六进制和十进制(了解)
(3)二进制与十六进制之间的相互转化(重点)
4个二进制位相当于1个十六进制位,对应位数相互转换就可以 中间会使用十进制作为桥梁
1111——>15——>F
3. 原码 反码 补码
正数和0:
原码、反码、补码都一样
负数:
原码:符号位为1,其它转为对应的二进制数字即可
反码:原码基础上,符号位不变,其他位取反
补码:反码基础上,+1
注:计算机上存储的是补码
补码计算器:https://www.lddgo.net/convert/number-binary-code
第 6 章 数据类型
bit——比特(b)
byte——>字节(B)
1. 整数类型
(1)整型划分
类型名称 | 存储长度 |
---|---|
short int 短整型 | 2字节 |
int 整型 | 4字节 |
long int 长整型 | 4或8字节 |
long long int 长长整型 | 8字节 |
注:① 每种类型又分为有符号(signed)和无符号(unsigned)
② 默认表示有符号,如 int 表示 signed int
③int、signed 都可省略
int = signed int =signed;short = signed short int
(2)字面量后缀(不需要记)
数据类型 | 字面量后缀 | 数据类型 | 字面量后缀 |
---|---|---|---|
int | 没有 | unsigned int | U |
long | L | unsigned long | UL |
long long | LL | unsigned long long | ULL |
注:① 字面量后缀不区分大小写
② U和L可以自由组合,UL等同于LU,ULL等同于LLU
③short 与 int 字面量后缀使用相同
(3)格式占位符
数据类型 | 格式占位符 | 数据类型 | 格式占位符 |
---|---|---|---|
int | %d | unsigned int | %u |
short | %hd | unsigned short | %hu |
long | %ld | unsigned long | %lu |
long long | %lld | unsigned long long | %llu |
注:数据类型与格式占位符要一一对应
(4)等宽整数类型 ——只是自行定义的,为了增加代码的适配性,提高程序的可移植性
位于标准库头文件 stdint.h
中
int8_t uint8_t
int16_t uint16_t
int32_t uint32_t
int64_t uint64_t
int8_t n1 = 100; // 8个二进制位 1 字节的有符号整数
uint8_t n2 = 101; // 8个二进制位 1 字节的无符号整数
int32_t n3 = 10; // 32个二进制位 4 字节的有符号整数
uint32_t n4 = 11; // 32个二进制位 4 字节的无符号整数
2. 浮点类型 ——常用的是double
(1)浮点类型划分
数据类型名 | 存储长度 | 有效小数位数 |
---|---|---|
float 单精度 | 4 | 6~9 |
double 双精度 | 8 | 15~18 |
long double 长双精度 | 10~16 | 18或更多 |
都有符号
默认是double
有效小数位显示的情况:
float、double、Long double 的输出显示的有效小数位:默认输出6位
注:
printf("float: n3=%.2lf \n",n3);
//在%后加入 .2 就表示输出默认显示几位小数,默认显示6位小数,不过在计算机上存储的是对应的存储长度 及 有效小数位,只是输出显示的设置罢了
(2)浮点类型字面量后缀(不需要记)
注:字面量后缀加不加都可以
类型 | 字面量后缀 |
---|---|
float | F |
double | 没有 |
long double | L |
注:字面量后缀不区分大小写!
小数0.55前的0可以省略,等同于 0.55
(3)格式占位符
数据类型 | 十进制形式格式占位符 | 科学计数法格式占位符 |
---|---|---|
float | %f | %e |
double | %lf | %le |
long double | %Lf | %Le |
分别对应两种形式的占位符使用:
%.3 小数保留3位 %e 保留一个整数位
注:printf() 输出的时候,%f 可以表示 float 和 double
scanf() 获取输入的时候,只有 %lf 表示double
科学计数法说明:
double n2 = 5.2e2; // 5.2*10^2
(4) 浮点类型存储原理
浮点数会分成 符号位、指数位、尾数位进行存储
3. 字符类型
1. 字面量表示
单引号
2. 转义字符 (也有对应的ASCII码值)
\n ——换行符
\' ——表示'
\\ ——表示\
\t ——表示制表符
3. 字符类型的本质
本质是一个字节的整数,分为 char 和 unsigned char
其中signed char取值范围-128 ~ 127,unsigned char取值范围0 ~ 255。默认是否带符号取决于当前运行环境。
4.格式占位符
使用 %c 表示char类型。
5. ascII 码 *(记)
A 65
a 97
6. 存储过程
存储字符——>在ASCII码表中读取对应的十进制数字——>转换为对应的 二进制数字 存储在计算机中
注:设计之初,ASCII码只为了表示英文字母的对应数字的转换,不适用与全球;现今创建出了UTF-8编码,该编码可以表示几乎所有语言中的字符
ASCII码只有128个(也就是2^7),一个字节
原因:二进制编码限制。ASCII码使用7位二进制数来表示一个字符,总共可以表示2^7=128个不同的字符,这种设计既满足了当时的需求,也保证了编码的简洁性和效率。
ASCII码的最高位设置为0,这是出于奇偶校验的需要,确保了兼容性和错误检测的能力。
编码时,存储原理:
* 存入字符:与ASCII码中选出对应的 十进制数字 ——>把其转化位 二进制数 存储
* 存入数字:直接把 十进制数字 ——>转化为 二进制数 存储
注:ASCII码 中的字符包含 09(只包含一位数),az,A~Z
![img](file:///C:\Users\admin\AppData\Local\Temp\ksohtml7636\wps1.png)
char字符类型中数字表示的含义,对应于ASCII
1、
char c9 = 199; //199相对于char类型是指的ASCII值,199超过了ASCII值的范围
char c10 = 65; //65在ASCII中对应的是A,而1对应的是空白
2、1对应的是ASCII值为 空白 ,所以输出显示的也是空白
4. 布尔类型
说明:布尔类型是一种形式(int)的别名:
int ——> bool
True ——> 1 (其他 非0 都是 1 )
False ——> 0
1. 第一种方式
C89标准,使用宏定义(#define )
2. 第二种方式
C99标准,添加 _Bool 类型
3. 第三种方式
C99标准,标准库头文件 <stdbool.h>
bool true false
总结:三种方式都可以修改布尔类型的变量,不过分为两种:1、第一种为一种,可以直接修改布尔类型变量的值
2、第二、三为一种,修改时:0为0,其他非零都为1
第一种 使用宏定义
#include <stdio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
int main()
{
//定义布尔类型的变量
BOOL is_ok =TRUE;
BOOL is_pass = FALSE;
//is_pass可以被修改
is_pass =-6;
printf("is_ok=%d, is_pass=%d \n",is_ok,is_pass);
//条件判断
if(is_ok)
{
printf("OK! \n");
}
else
{
printf("不OK!\n");
}
if(is_pass)
{
printf("PASS!\n");
}
else
{
printf("不PASS!\n");
}
}
第二种 添加 _Bool 类型
#include <stdio.h>
int main()
{
//定义布尔类型的变量
_Bool is_ok = 1;
_Bool is_pass = 0;
第三种 标准库头文件 <stdbool.h>
#include <stdio.h>
#include <stdbool.h>
int main()
{
// 定义布尔类型的变量
bool is_ok = true;
bool is_pass = false;
总结
常量
1. 什么是常量
运行时,值不能改变
2. 常量分类
字面量常量
标识符常量
3. 定义常量两种方式(标识符常量)
#define 常量名 值
const 数据类型 常量名 = 值;
二进制
1. 进制
二进制、十进制、十六进制
2. 进制转换
3. 原码、反码、补码
正数和0: 三码一致
负数:反码:原码基础上,符号位不变,其他位取反
补码:反码+1
数据类型
1. 整数
int
short
long
long long
每种类型分为:signed、unsigned
等宽类型 eg:int32_t、uint8_t,需要有头文件<stdint.h>
2. 浮点
float
double
long double
3. 字符
本质:单字节整数
字面量表示: 单引号
占位符:%c
分有符号和无符号,都是128种
转义字符
4. 布尔
① #define
② C99 _Bool
③ C99 <stdbool.h> bool、true、false
附录
修改配置,提高警告等级
打开 .vscode
文件夹下的 tasks.json
文件,添加如下选项:
"-Wall"
最终效果如下:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc.exe 生成活动文件",
"command": "D:\\Program Files\\mingw64\\bin\\gcc.exe",
"args": [
"-fdiagnostics-color=always",
"-Wall",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
下述两组 两个需要挨在一起:
第一组:
"-g",
"${file}",
第二组:
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
标签:02,常量,int,double,数据类型,long,C语言,二进制,十进制
From: https://www.cnblogs.com/petard/p/18113936