小白学C++ L4 数据类型

数据类型

  • 数据类型将会决定一个变量存储什么样的信息,从而决定变量的容量有多大,在内存中需要分配多大的空间。

  • C++中的数据类型分为基本类型复合类型

    • 基本类型包括了整数、浮点数;
    • 复合类型是在基本类型的基础上创建的,包括数组、字符串以及结构体等。

整数类型

  • 整数类型分为数值整数类型字符类型
  • 数值整数用来表示没有小数部分的数字。
    • 数值整数可以按照占用内存大小分为shortintlong以及long long这四种,占用内存越大的类型能表示的数值范围就更大。
    • 同时又可以按照是否表示负值分为有符号版本和无符号版本
  • 字符类型则专门用来存储计算机中的基本符号:英文字母、数字以及标点等。
表示范围

short、int、long以及long long这四种数值整数类型占用的字节数递增,所以能表示的整数范围也递增。

  • short类型至少占据2个字节,即16位;一般占用2字节;
  • int在现代系统中一般占用4个字节,即32位;类型长度大于等于short类型;
  • long类型长度至少占据4个字节,且大于等于int类型;一般占用4个字节;
  • long long类型长度至少占据8个字节,且大于等于long类型;一般占用8个字节。

Tips: 为了避免不同的计算机系统的设计差异,C++提供了一个标准来保证各种类型的最小长度:

  • 计算机内存采用二进制的存储方式,每一个位可以表示0与1两种状态,因此占据 n n n位的内存块,可以表示 2 n 2^n 2n个不同的数字
  • 每个类型数据可以分别指定有符号版本和无符号版本,用来明确该类型是否需要表示负值。
    • 比如unsigned int就表示无符号的int类型,只能表示正值;signed int就表示有符号的int类型,可以表示负值。
    • 在不指定有无符号时,都默认是有符号版本
  • 如果是无符号版本,那么一个8位的内存块可以一一对应到0~255之间的整数;
  • 如果是有符号版本,那么就会考虑负数,这个8位的内存块可以表示一128~127之间的整数。
用法

数据类型 变量名称;

short price = 500;    // 单价
int coupon = -2000;   // 优惠
long total = 48000;   // 总价
  • 默认状态下short等四个整数类型都是符号类型,这使得它们能够表示的最大数值减小了一半左右。
    • short默认状态下是符号类型,占据16位内存,数据范围在 − 2 15 ~ 2 15 − 1 −2^{15} ~2^{15}−1 2152151也即**-32768~32767**之间,所以无法正确表示48000。
  • 在确定变量的数值不会是负数的情况下,我们可以利用unsigned关键字,加在原有数据类型之前,创建无符号的整数类型。
    • unsigned short舍弃了负数的表示,数据的表示范围在 0 ~ 2 16 − 1 0 ~2^{16}−1 02161也即0~65535之间,可以正确表示48000。
#include <iostream>
using namespace std;

int main() {
    // TODO 声明 short 类型的变量 total_1,并初始化为48000
    short total_1 = 48000;
    cout << "总价为:" << total_1 << "元。\n";
    
    // TODO 声明 unsigned short 类型的变量 total_2,并初始化为48000
    unsigned short total_2 = 48000;
    cout << "总价为:" << total_2 << "元。\n";
    
    return 0;
}

运行结果:

总价为:-17536元。
总价为:48000元。

整数类型-字符整数类型
  • 字符类型char是另一种特殊的整数类型,它专门用来存储计算机中的基本符号:英文字母、数字以及标点等。

Tips: 计算机通过ASCII编码,将128个字符映射到对应数字上,于是我们使用一个字节(8位)就可以将所有的字符表示出来。通过查看内存,可以发现储存在类型为char的变量中的实际上是一个整数,对应于这个字符的ASCII编码值。

所以,我们可以既可以使用字符常量,也可以使用字符对应的ASCII编码,来给char类型的变量赋值。

  • 字符整数类型虽然存储方式和数值整数类型相似,都是存放一个数值,但是在输出显示时是不同的。
    因为cout识别到了size_1和size_2是字符类型变量,从而在输出时自动进行了转换,把数字转成了该编码对应的字符。
// 初始化一个 int 类型
int length = 76; 
// 用字符常量初始化一个 char 类型
char size_1 = 'L';
// 用整数常量初始化一个 char 类型,字符L的ASCII编码值为76
char size_2 = 76;

cout << "衣服的长度为:" << length << "厘米。\n";
cout << "衣服的大小为:" << size_1 << "号。\n";
cout << "衣服的大小为:" << size_2 << "号。\n";

输出结果:

衣服的长度为:76厘米。
衣服的大小为:L号。
衣服的大小为:L号。

浮点类型

计算机用浮点数表示两类数:

  • 带小数部分的数字; 例如:圆周率3.14、黄金分割比例0.618等,这些数字在整数之间
  • 数值非常大的数字。 例如:宇宙中原子个数约10的80次方,这个数字已经无法被long long整型表示

C++中的浮点数分为三种类型:floatdouble以及long double,分别表示不同的精度。

浮点数的精度在于它可以表示的有效位数以及指数范围

  • 指数范围指的是可以表示的指数幂次大小;
  • 有效位数用来描述浮点数值的刻画精确程度。

Tips: 需要注意的是,有效位数不会因为小数点的改变而改变,无论314000或者3.14000,它们的有效位数都是3位,多出来0可以看作是一种占位符,因为实际有意义的数字只有3个:3、1和4。

在三种浮点类型中,更大的内存空间可以表示更多的有效位数:

  • float类型通常占用4个字节,有效位数为6位
  • double类型占用的空间是float类型的两倍,即8个字节,有效位数为15位
  • long double类型一般占用16个字节的空间
#include <iostream>
using namespace std;

int main() {
    // TODO 声明并初始化一个float类型的变量 pi_1 为 3.1415926
    float pi_1 = 3.1415926;
    printf("圆周率为:%.7f。\n", pi_1);   // 输出浮点数的7位小数
    // TODO 声明并初始化一个double类型的变量 pi_2 为 3.1415926
    double pi_2 = 3.1415926;
    printf("圆周率为:%.7f。\n", pi_2);   // 输出浮点数的7位小数
    return 0;
}

运行结果:

圆周率为:3.1415925。
圆周率为:3.1415926。

Tips:这是由于float类型只能确保6个有效位数的精确显示,最后的数字5是系统随机表示的。想要完整显示8个有效位的圆周率,我们需要使用double类型的变量进行初始化。

基础知识:

  • 常量和变量都有数据类型。
  • 字符常量应是单引号。
  • 操作数为字符或短整形时,系统自动转换成整形。操作数为实型时,系统自动转换成双精度型。当两数操作数类型不同时,将精度低(或表示范围小的)的操作数的数据类型变换到与另一操作数类型相同再进行运算。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值