一.数据类型
现实社会中的人,分成很多“类型”,正所谓“物以类聚,人以群分”,不同类型的人,思考问题,处理的问题的方式都不一样,不同的数据类型,计算机内的处理的方式也是不同的。
计算机内的数据,也分成很多类型:
int | unsigned int | char |
unsigned char | long | long long |
unsigned long | short | unsigned short |
float | double | 各类指针类型 |
枚举类型 | struct 结构类型 | union 联合类型 |
bool | string | 类 |
不同数据类型的区别:1.表示意义不同
2.占用内存不同
3.表示的范围不同
4.使用方法不同
二.变量
变量是构建IT大厦的砖块。
1.为什么使用变量
程序在运行中,需要保存很多内容常常变化的数据。比如,射击类的游戏中不断变化的“击杀数”和“死亡数”。一个程序运行时,大量数据存储在“变量”中。数据在大量变量之间“计算”、“交换”,变量是处理数据的基本实体。
2.变量是什么
变量,是内存中的一块存储空间,即一小块内存。
3.变量和数据类型的关系
变量是一个盒子,盒子里保存了“数据”,数据又分成很多“类型”(数据类型)。
(1) 变量的类型就是变量中数据的“类型”。
(2) 变量在定义(创建)时,必须先指定它的类型。【相当于制作一个盒子时,必须先确认这个盒子是用来装什么的】。
(3) 1个变量只有一个类型,而且不能改成其他类型。
4.变量的定义
定义形式 1:int x;
int y;
定义形式2:(不推荐)
int x , y;
定义形式3:(定义的时候,设置一个初始值)
int x = 100;
int a; //定义了一个变量
a = 100;
内存的存储单位-“字节”,一个字节包括八个二进制位。
5.变量的命名规范
(1) 只能包含 3 种字符(数字、大/小写字母,下划线)
(2) 不能以数字开头(即,只能以字母或下划线开头)
int 2name; //非法
(3) 不能和“关键字”同名(C语言内部已经使用的“名称”),比如类型名 int
变量名的最大长度,C语言没有明确规定。最大长度限制,取决于编译器,一般都在32以上。同时变量名最好“见名知意”,不再使用汉语拼音的简写和缩写。
命名风格:
1) 下划线风格
int student_age;(一般用于变量名、函数名)
2) 小驼峰风格:第一个单词之后的单词大写
int studentAge;(一般位于变量名、函数名)
3) 大驼峰风格:从第一个单词开始大写
class StudentAge;(一般用于“类名”)。
4)全部大写(一般用于“宏”)
#define MAX_AGE 30
三.用于计数的整数类型
1.int 类型
使用最多的整数类型,在内存中占用 4 个字节,表示范围 -2^31 ~ 2^31 - 1。【正负21亿左右】
2.long 长整型
long 也就是 long int 可用来存储最大的整数。在 32 位系统上,占 4 个字节,和 int 相同。在64位系统上,占 8 个字节【正负 9 百亿亿左右】
3.long long 长长整型
用来存储整数,在内存中占 8 字节,很少使用,仅用于特殊的运算。
4.short 短整型
用来存储整数。在内存上 2 字节,用于存储小范围的整数,表示范围 -2^15 ~ 2^15 - 1【正负三万多】
5.无符号数
在类型前加上 unsigned ,例如 unsinged int,unsigned long,unsigned long long,unsigned short。最小值都是0,最大值是对应的有符号数的2倍,原理如下。
四.用于单个字符的数据类型
字符类型:char。 占用一个字节。
char name = 'a';
内存示意图:
PS:字符的实际表示:
所有的字符,使用对应的 ASCII 值来存储。为什么呢?因为计算机中只能存储 0 和 1 的组合。
ASCII 码,使用 1 个字节(包含 8 个二进制位,即 8 个 0 和 1 的组合)
比如:'A',用 0100 0001 来表示,就是65
'B',用 0100 0010 来表示,就是66
char name = 'a';
char name = 'a'; 等效于 char name = '97';
char 类型的另一种用法:用来表示小范围的整数。
实例:int x = 0;
x = 'a' + 1; // 97 + 1
五.用于精确计算的数据类型
需要精确计算的数字,工程应用,用整数类型并不合适。
1. float 类型 (单精度浮点数类型)
用来存储带小数部分的数据。在内存中占 4 个字节。表示范围:-3.4*10^38 ~ 3.4*10^38。精度:最长 7 位有效数字(7 位10 进制位)。
float y = 1.123456789; // 精度只能取到 1.1234568,在第 7 位(整数部位不算)是四舍五入后的值。
float 类型的存储方式:
符号位:0 表示正数,1 表示负数
阶码:指数 + 127
转化过程:13.625的转化
2. double 类型(双精度类型)
用来存储小数部分的数据,8 个字节。具体的存储类型和 float 相似。但是阶码为 11 位,尾数为52位。
表示范围:-1.7 * 10 ^ 308 ~ 1.7 * 10 ^ 308
精度:最长 16 位有效数字
double y = 1.12345678901;
3.浮点类型的常量
带小数的常量默认都是 double 类型
3.14 是 double 类型
3.14f 强制为 float 类型
可以用“科学计数法”表示浮点类型的常量,1.75E 或 1.75e ,1.75e 就是 1.75 乘以 10 的 5 次方(100000),175000.0
注意:
1 是 int 类型的常量
1.0 是 double 类型的常量
4.浮点数据的输出控制
一般,浮点数的默认精度就是6,为了符合实际开发,我们就需要修改浮点数的精度。
#include <iostream>
#include <Windows.h>
using namespace std;
int main(void) {
double value = 12.3456789;
// 默认精度是6,所以输出为 12.3457
//(默认情况下,精度是指总的有效数字)
cout << value << endl;
// 把精度修改为4,输出 12.35,对最后一位四舍五入
// 精度修改后,持续有效,直到精度再次被修改
cout.precision(4);
cout << value << endl;
// 使用定点法,精度变成小数点后面的位数
// 输出 12.3457
cout.flags(cout.fixed);
cout << value << endl;
// 定点法持续有效
// 输出 3.1416
cout << 3.1415926535 << endl;
// 把精度恢复成有效数字位数
cout.unsetf(cout.fixed);
cout << value << endl; //输出 12.35
cout << 3.1415926535 << endl; //输出 3.142
system("pause");
return 0;
}
cout.precision(4) 表示将精度修改为4,输出数字的总共位数就是4,精度修改后持续有效,直到精度再一次被修改。
cout.flags(cout.fixed) 表示定点法,精度修改为小数点后面的位数,也就是输出小数点后四位。
cout.unsetf(cout.fixed) 表示将精度恢复成有效数字位数。
六.常量
将一个比较容易让人迷糊的问题。
1. 字面常量
int 型字面常量:1,2,3,100。
long 型字面常量:200L(或者200l,建议使用大写字母L)。
long long 型字面常量:1000000000000LL(建议使用大写字母LL)。
char 型字面常量:'a','b','X','-'。
float 型字面常量:3.14f (变量和常量是有区别的)。
double 类型常量:3.0,3.14
2. 16进制常量
以 0x 作为前缀。
123 = 1*100 + 2*10 + 3*1
0x11 = 1*1 + 16*1 = 17(十进制)
10 进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | A | B | C | D | E |
3. 8 进制常量
以 0 作为前缀。
011 相当于 9。