002_C++数据类型

整数型

数据类型

使用编程语言进行编程时,需要用到各种变量来存储各种信息,而变量在定义时必须要有对应的数据类型。

你可能需要存储各种数据类型(比如整型、字符型、浮点型)的信息,操作系统会根据变量的数据类型,来分配内存并且决定在内存中存储什么类型的数据。

C++中常见的数据类型
  • 整型:int(整型)、long long(长长整型)
  • 浮点型(实型):float(单精度浮点型)、double(双精度浮点型)
  • 字符型:char
  • 布尔型:bool
int、long long

常见的整数型包括int long long

虽然intlong long都能声明一个整型变量,使变量能够存储整数
但是intlong 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

![在这里插入图片描述](https://img-blog.csdnimg.cn/c191f54629ba4bfe8296b7a98ba78baa.png

计算机的存储单位

字节byte是计算机最基本的存储单位
比特bit是计算机最小的存储单位,bit即二进制的位

除此之外更大的存储单位还包括KB MB GB TB等等
换算关系如下

  • 1TB = 1024GB
  • 1GB = 1024MB
  • 1MB = 1024KB
  • 1KB = 1024B
  • 1B = 8bit

8bit即8位二进制

原码、反码、补码

对于一个数,计算机要使用一定的编码方式进行二进制存储,二进制存储是计算机存储的本质。
原码反码补码是机器存储一个具体数字的编码方式,计算机是以二进制补码的形式进行数据的存储。

原码

原码就是符号位加上真值的绝对值,即用最高位表示符号,其余位表示值。比如如果是8位二进制:

  • [+1] (原码) = 0000 0001 最高位为0,表示正数
  • [ -1] (原码) = 1000 0001 最高位为1,表示负数
反码

反码表示方式是用来处理负数的,正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

  • [+1] = [00000001] (原码) = [00000001] (反码)
  • [ -1] = [10000001] (原码) = [11111110] (反码)
补码

补码的表示方法是:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(即在反码的基础上+1)

  • [+1] = [00000001] (原码) = [00000001] (反码) = [00000001] (补码)
  • [ -1] = [10000001] (原码) = [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级别的数据,对于我们现阶段的编程,掌握intlong 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类型的变量可以用来存储truefalse,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小凡学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值