顺序结构程序设计

数据类型

  • 数据类型将会决定一个变量存储什么样的信息,从而决定变量的容量有多大,在内存中需要分配多大的空间。
  • C++中的数据类型分为基本类型复合类型
  • 其中基本类型包括了整数浮点数
  • 复合类型是在基本类型的基础上创建的,包括数组字符串以及结构体

整数类型

  • 整数类型分为数值整数类型字符类型

整数类型—数值整数类型

  • 数值整数用来表示没有小数部分的数字。

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

  • 表示范围

    在数学中,整数的范围是无穷无尽的,但是计算机的内存是有限的,所以一种类型能表示的整数范围也是有限的。因此,在C++中,我们需要根据需求,选择合适的数值整数类型。

    • shortintlong以及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个不同的数字。
      • 比如一个 8 位的内存块,可以表示 2 的 8 次方个不同的组合,也就是说能表示 256 个不同的整数;
      • 32 位的int类型,可以表示 2 32 2^{32} 232=4294967296232=4294967296 个不同的整数。
    • 每个类型数据可以分别指定有符号版本无符号版本,用来明确该类型是否需要表示负值。
      • 比如unsigned int就表示无符号的int类型,只能表示正值;
      • signed int就表示有符号的int类型,可以表示负值。
      • 在不指定有无符号时,都默认是有符号版本。
    • 如果是无符号版本,那么一个8位的内存块可以一一对应到0~255之间的整数;
    • 如果是有符号版本,那么就会考虑负数,这个8位的内存块可以表示一128~127之间的整数。

🌰

#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;
}

整数类型-字符整数类型

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

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

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

  • 字符整数类型虽然存储方式和数值整数类型相似,都是存放一个数值,但是在输出显示时是不同的。
#include <iostream>
using namespace std;

int main() {
    // 初始化一个 int 类型
    int length = 76; 
    // TODO 用字符常量初始化一个 char 类型 size_1 为L
    char size_1 = 'L';
    // TODO 用整数常量初始化一个 char 类型 size_2 为L,字符L的ASCII编码值为76
    char size_2 = 76;

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

浮点类型

  • 计算机用浮点数表示两类数:
    • 小数部分的数字; 例如:圆周率3.14、黄金分割比例0.618等,这些数字在整数之间
    • 数值非常的数字。 例如:宇宙中原子个数约10的80次方,这个数字已经无法被long long整型表示
  • C++中的浮点数分为三种类型:floatdouble以及long double,分别表示不同的精度
  • 浮点数的精度在于它可以表示的有效位数以及指数范围
    • 指数范围指的是可以表示的指数幂次大小;

由于浮点数更多的应用是用来表示带小数的数字,所以我们主要从有效位数的角度讲解精度。

  • 有效位数用来描述浮点数值的刻画精确程度

    例如:3.14的有效位数是3位,3.1415926的有效位数是8位。

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;
}

位运算符与表达式

C++按位运算符

本节内容将介绍C++中按位进行的运算符,简称位运算

  • 在计算机中,数据以二进制的形式储存
    • 每8位(bit)构成一个字节(byte)
    • 每个位具有01两种状态中的一种

Tips:通过多个字节组合,内存以二进制形式存放数值。例如,

  • 字符类型char的常量7大小为1个字节
    • 存储为8位二进制数:0000 0111
  • 整数类型int的常量7大小为4个字节
    • 存储为32位二进制数:0000 0000 0000 0000 0000 0000 0000 0111

C++中共包含6种按位运算符

  • 按位与运算符&
  • 按位或运算符|
  • 异或运算符^
  • 按位取反运算符~
  • 左移运算符<<
  • 右移运算符>>

Tips:按位运算符只能对字符整型以及数值整型数据类型的常量变量使用,不能对浮点类型数据进行计算。

位与运算符

  • 按位与运算符&对两个操作数按照二进制位进行与运算

Tips:对于操作数ab,下表演示了&运算符的工作方式:

img

Tips:&运算符只有在两个操作数的对应位同时为1时,才会得到结果1

位或运算符

  • 按位或运算符|对两个操作数按照二进制位进行或运算

Tips:对于操作数ab,下表演示了|运算符的工作方式:

img

Tips:或运算只要在两个操作数的对应位存在1时,就可以得到结果1

位异或运算符

  • 位异或运算符^对两个操作数按照二进制位进行异或运算

Tips:对于操作数ab,下面的真值表演示了^运算符的工作方式:

img

Tips:异或运算在两个操作数的对应位不相同时,会得到结果1;也可以看作是二进制下的无进位相加

取反运算符

  • C++中,取反运算符~对单个二进制操作数按位进行取反运算

Tips:二进制位取反规则是0110

  • 在计算机中,所有的二进制数据都是用补码保存的。
    • 正数的补码就是原码本身
      • 正数变量A的原码为0011 1100,补码同样等于0011 1100
    • 负数的补码是在其原码的基础上,符号位不变,其余各位取反然后+1
      • 负数变量~A的原码为1100 0011,补码等于1011 1100 + 1 = 1011 1101,值为-61,故~A = -61

Tips:一个对操作数取反运算的简单规律是:会得到比原先操作数的相反数还小1的结果。

左右移运算符

  • 在C++中,

    左移运算符<<可以将一个操作数的各二进制位全部左移若干位。

    • 左边多余的二进制位将被丢弃
    • 右边不足的二进制位将被补0

Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2运算。

  • 在C++中,

    右移运算符>>可以将一个操作数的各二进制位全部右移若干位。

    • 右侧多余的位将会被舍弃

    • 左侧对于无符号数,会在左侧补0
      左移运算符<<可以将一个操作数的各二进制位全部左移若干位。

    • 左边多余的二进制位将被丢弃

    • 右边不足的二进制位将被补0

Tips:在结果符号位不改变,并且没有超过表示范围的情况下,左移运算符移动了几位,相当于对原操作数进行了几次乘2运算。

  • 在C++中,

    右移运算符>>可以将一个操作数的各二进制位全部右移若干位。

    • 右侧多余的位将会被舍弃
    • 左侧对于无符号数,会在左侧补0
    • 左侧对于有符号数,会用符号位补齐:正数为0,负数为1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值