整数型
数据类型
使用编程语言进行编程时,需要用到各种变量来存储各种信息,而变量在定义时必须要有对应的数据类型。
你可能需要存储各种数据类型(比如整型、字符型、浮点型)的信息,操作系统会根据变量的数据类型,来分配内存并且决定在内存中存储什么类型的数据。
C++中常见的数据类型
- 整型:
int
(整型)、long long
(长长整型) - 浮点型(实型):
float
(单精度浮点型)、double
(双精度浮点型) - 字符型:
char
- 布尔型:
bool
int、long long
常见的整数型包括int
long long
虽然int
和long long
都能声明一个整型变量,使变量能够存储整数
但是int
和long long
声明变量时,分配给变量的内存空间大小不同。
我们可以使用sizeof
运算符计算变量所占的内存空间大小,单位为字节(byte
)
#include <iostream>
using namespace std;
int main() {
// 整型-4字节
int a = 1;
// 长长整型-8字节
long long b = 1;
cout << "a=" << a << ",变量a的内存大小为:" << sizeof(a) << "byte" << endl;
cout << "b=" << b << ",变量b的内存大小为:" << sizeof(b) << "byte" << endl;
return 0;
}
运行结果
a=1,变量a的内存大小为:4byte
b=1,变量b的内存大小为:8byte
计算机的存储单位
字节byte
是计算机最基本的存储单位
比特bit
是计算机最小的存储单位,bit
即二进制的位
除此之外更大的存储单位还包括KB
MB
GB
TB
等等
换算关系如下
- 1TB = 1024GB
- 1GB = 1024MB
- 1MB = 1024KB
- 1KB = 1024B
- 1B = 8bit
8bit即8位二进制
原码、反码、补码
对于一个数,计算机要使用一定的编码方式进行二进制存储,二进制存储是计算机存储的本质。
原码
、反码
、补码
是机器存储一个具体数字的编码方式,计算机是以二进制补码
的形式进行数据的存储。
原码
原码就是符号位加上真值的绝对值,即用最高位表示符号,其余位表示值。比如如果是8位二进制:
- [+1] (原码) =
0
000 0001 最高位为0,表示正数 - [ -1] (原码) =
1
000 0001 最高位为1,表示负数
反码
反码
表示方式是用来处理负数的,正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
- [+1] = [
0
0000001] (原码) = [00000001] (反码) - [ -1] = [
1
0000001] (原码) = [11111110] (反码)
补码
补码的表示方法是:正数的补码就是其本身
,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)
- [+1] = [
0
0000001] (原码) = [00000001] (反码) = [00000001] (补码) - [ -1] = [
1
0000001] (原码) = [11111110] (反码) = [11111111] (补码)
字节byte
问:1byte
能存储的数据范围是多少呢?
答:1byte
= 8位二进制,其中最高位为符号位,0代表正数,1代表负数,其余位按照权值参与数值运算。
- 现在讨论数值上限:
0111 1111[原码] = 0111 1111[反码] = 0111 1111[补码],虽然计算机是以二进制补码进行存储的,但是计算的时候要用原码进行计算,所以0111 1111[原码]对应的数值为 2 ^ 7 - 1 = +127
0111 1111 根据位权算存储最大值
第一位0表示正数 不变
计算 0111 1111
1 * 2 ^ 0 + 1 * 2 ^ 1 + 1 * 2 ^ 2 + 1 * 2 ^ 3 + 1 * 2 ^ 4 + 1 * 2 ^ 5 + 1 * 2 ^ 6
最后算出可以存储的最大值是 2 ^7 - 1
- 现在讨论数值下限:
可以用[1000 0000]表示-128,(-1) + (-127) = -128 = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补码,所以在用补码运算的结果中,[1000 0000]补码就是-128,而-128并没有原码和反码表示。
结论:1byte能存储的数值范围是[-2 ** 7, +2 ** 7 - 1],即[-128, +127]
int存储数据的范围
int
声明的变量占4字节
,4字节 = 32bit
32bit即32位二进制,其中最高位为符号位(0代表正数,1代表负数),通过对应的二进制补码换算为十进制可得,int存储的数据的范围为[-2 ^ 31,+2 ^ 31 - 1]
2 ** 31 - 1为10 ** 9级别的数据,当数据>=10**9级别,此时int可能存储不下,我们需要更换可以存储更大的数据的数据类型。
#include <iostream>
using namespace std;
int main() {
// 整型-4字节
int a;
// 输入十亿数值 10 0000 0000
cin >> a;
cout << a;
return 0;
}
结果:
1000000000
1000000000
输入30 0000 0000 30亿测试
结果:
3000000000
2147483647
当存储数据超过int存储范围,输出一个最高上限,2147483647
值就是int存储的最高上限
long long存储数据的范围
long long
声明的变量占8字节
,8字节 = 64bit
64bit即64位二进制,其中最高位为符号位(0代表正数,1代表负数),通过对应的二进制补码换算为十进制可得,long long
存储的数据的范围为[-2 ^ 63,+2 ^ 63 - 1]
2 ** 63 - 1为10 ** 18级别的数据,对于我们现阶段的编程,掌握int
和long long
两个整型数据类型足矣。
9223372036854775807
值就是long long存储的最高上限。
算术运算
同数学一样,C++也能够进行数值的算术运算,分别用+ - * / %
运算符做加法、减法、乘法、除法、取模运算
C++算术运算和数学的算术运算优先级也是一样的,C++进行算术运算时先算乘除模,后算加减,如果有括号,先算括号里面的
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
// 算术运算
cout << a << "+" << b << "=" << a + b << endl;
cout << a << "-" << b << "=" << a - b << endl;
cout << a << "*" << b << "=" << a * b << endl;
cout << a << "/" << b << "=" << a / b << endl;
cout << a << "%" << b << "=" << a % b << endl;
return 0;
}
运行结果:
输入 1 2
1 2
输出如下
1+2=3
1-2=-1
1*2=2
1/2=0
1%2=1
--------------------------------
Process exited after 7.77 seconds with return value 0
请按任意键继续. . .
除法(/)需要注意:
整数间的除法是整除的意思。
有浮点数参加的是正常除法。
#include <iostream>
using namespace std;
int main()
{
int a = 5;
int b = 2;
float c = 1.5;
cout << "整型 / 整型 " << "a / b = " << a / b << endl;
cout << "整型 / 浮点型" <<"a / c = " << a / c << endl;
return 0;
}
运行结果:
整型 / 整型 a / b = 2
整型 / 浮点型a / c = 3.33333
return 0; 的作用
针对上面案例,如果我们输入1和0,结果会是什么样呢?
1 0
1+0=1
1-0=1
1*0=0
--------------------------------
Process exited after 3.577 seconds with return value 3221225620
请按任意键继续. . .
之前我们了解过return
在主函数中代表结束整个C++程序
而return本身有返回的意思,return 0含义代表返回0,而主函数前的int就是控制返回值的类型的,主函数的返回值必须为整型
若C++程序如果正常结束,整个程序会返回一个0,代表程序没有崩溃
那么如果C++程序出现了错误导致崩溃,就不会返回0,而是一个错误码,所以通过return 0我们还可以知道程序中是否有bug,进而改进程序
浮点型(实型)
float、double
C++浮点类型有两种,分别是单精度浮点型float(占4字节)
和双精度浮点型double(占8字节)
float
有效数字位精确到小数点后6-7位
,而double
有效数字位精确到小数点后15-16位
当涉及到的浮点计算产生的数值通常来讲比较大,有效数字位的精确度要求较高,所以我们平时遇到浮点计算首选double
即可,尽量减少数据溢出和数值不精确的情况。
float和double默认保留6位小数。
#include <iostream>
using namespace std;
int main() {
// 浮点型
float f = 3.14;
double d = 6.28;
int a = 3.14;
long long b = 6.28;
cout << "f=" << f << ",变量f的内存大小为:" << sizeof(f) << "byte" << endl;
cout << "d=" << d << ",变量d的内存大小为:" << sizeof(d) << "byte" << endl;
return 0;
}
运行结果:
f=3.14,变量f的内存大小为:4byte
d=6.28,变量d的内存大小为:8byte
演练1 理想身高 保留2位小数
#include <iostream>
#include <iomanip> // 格式化小数点头文件
using namespace std;
int main() {
int height;
cin >> height;
double weight = (height - 100) * 0.9 * 2;
// fixed << setprecision(2) 保留两位小数
cout << fixed << setprecision(2) << weight << endl;
return 0;
}
运行结果:
210
99.00
演练2 圆的面积 保留3位小数
#include <iostream>
#include <iomanip> // 格式化小数点头文件
using namespace std;
int main() {
double r;
cin >> r;
// 圆周率不可被修改
const double pi = 3.14;
double s = pi * r * r;
cout << fixed << setprecision(3) << s << endl;
return 0;
}
运行结果:
2
12.560
char
char
类型为字符类型,一个char类型变量占一个字节
,一个字符也占一个字节,所以一个char类型变量只能存储一个字符,在C++中直观地表示字符需要用英文下的单引号' '
表示,比如字符A要写成'A'
#include <iostream>
using namespace std;
int main() {
char ch = 'A';
cout << ch << endl << "变量ch的内存大小为:" << sizeof(ch) << endl
<< "字符A的内存大小为:" << sizeof('A') << endl;
return 0;
}
运行结果:
A
变量ch的内存大小为:1
字符A的内存大小为:1
字符金字塔
#include <iostream>
using namespace std;
int main() {
char ch; cin >> ch;
cout << " " << ch << endl
<< " " << ch << ch << ch << endl
<< ch << ch << ch << ch << ch << endl;
return 0;
}
运行结果:
*
*
***
*****
字符的编码
在计算机中,所有的数据在存储和运算时都要使用二进制数表示,例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码)而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASKII编码,统一规定了上述常用符号用哪些二进制数来表示。
ASKII
美国信息交换标准代码是由美国国家标准学会(American National Standard Lnstitute, ANSI)制定的,称为ASKII(American Standard Code for Information Interchange),它是美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语与其他西欧语言。它是最通用的信息交换标准,并等同于国际标准IOS/IEC646。ASKII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符
。而char占1字节
,我们知道1byte=8bit
,即8位二进制,char类型的存储数值范围为[-128, 127],所以char类型可以存储ASKII中编码为0~127的每一个字符。
字母大小写转换
#include <iostream>
using namespace std;
int main() {
char ch;
cin >> ch; // 输入a
ch = ch - ('a' - 'A'); // 小写转大写
//ch = ch + ('a' - 'A'); // 大写转小写
cout << ch; // 按照字符型输出就是A
//cout << ch - 32; 按照整型输出就是65
return 0;
}
运行结果:
a
A
布尔型
bool
bool
类型的变量可以用来存储true
和false
,true值为1,false值为0,也就是说bool类型的变量只能存储0或1
bool
类型的变量占1字节
#include <iostream>
using namespace std;
int main() {
bool b = 1;
cout << b << endl << "bool变量b的内存大小为:" << sizeof(b) << " byte" << endl;
return 0;
}
运行结果:
1
bool变量b的内存大小为:1 byte