信息的存储

程序是运行在计算机内存当中的

通常情况下,程序将内存视为一个非常大的数组,数组的元素是由一个个的字节组成,每个字节都由一个唯一的数字来表示,我们称为地址。这些所有地址的集合就称为虚拟地址空间

我们来看一下字节这个基本的信息存储单元,一个字节是由 8 个位(bit)组成。

在二进制表示法中,每一个位的值可能有两种状态,0或者1。

当这 8 个位全为 0 时,表示这个字节的最小值,二进制表示为 0;当这 8 个位全为 1 时,表示这个字节的最大值,二进制表示为 11111111。

如果用十进制表示,那么一个字节的取值范围就在 0~255(包含 0 和 255)之间

我们把这种按照一位一位表示数据的方式称为位模式,使用二进制表示法比较冗长,而十进制表示法与位模式之间的转换又比较麻烦。在计算机中,我们常引入 8 进制数和 16 进制数来表示位模式。

一. C/C++世界里的数据

编程其实就是对现实世界中的问题进行抽象,现实世界中的一些概念都可在 C++ 的世界里找到对应,比如:现实世界中最常见的数字,文字在C++世界就是数据

不同类型的数据,【长相】不一样,各司其职。只有认清各类型数据的【长相】,了解它们的功能,才能在计算机世界里完成现实世界的任务。

1.1 常用的数据类型

C/C++ 语言里内置数据类型有三种:char、int、double

int

int 数据类型对应的是现实世界里的整数

  1. 声明 int 变量:先写上 int,然后写变量名,最后加上一个分号。
int a;

变量

变量提供一个具名的,可供程序操作的存储空间。C++ 中的每个变量都有其数据类型,数据类型决定着变量所占内存空间的大小和布局方式,该空间能存储的值的范围,以及变量能参与的运算

注意:变量名只能由数字,字母,下划线组成,并且开头不能是数字。变量名的长度没有限制,但是对大小写敏感。

建议:变量名要尽量能体现实际含义

声明只是创建了变量,但是并没有给他们提供值,要获取值有两种方法,第一种途径是赋值,第二种途径是初始化。

  1. 赋值与初始化

赋值与初始化是两个完全不同的操作,初始化的含义是创建变量时赋予其一个初始值;而赋值的含义是把对象的当前值擦除,以一个新值替代。

// 赋值
int num;
num = 1;

// = 是赋值运算符
// 初始化, 就是在声明变量的时候为变量赋一个初始值
int num = 1;

默认初始化:如果定义变量时没有指定初值,则变量会被默认初始化。默认值到底是什么由变量类型决定,同时定义变量的位置也会对此有影响。

建议初始化每一个内置类型的变量。虽然并非必须这么做,但如果我们不能确保初始化后程序安全,那么这么做不失为一种简单可靠的方法

  1. 打印 int 值
int a = 1;
// %d 为以十进制显示有符号整数的转换说明
printf("%d\n" , a);

格式化字符串中的每个 %d 都应与待打印变量列表中相应的 int 值匹配

  1. 示例程序 1
#include <stdio.h>

int main(void)
{
    int ten = 10;
    int two = 2;

    printf("Doing it right: ");
    printf("%d minus %d is %d\n" , ten , two , ten-two);
    printf("Doing it wrong: ");
    printf("%d minus %d is %d\n" , ten);
    return 0;
}
  1. 显示八进制和十六进制

以 8 进制显示数字的转换说明为 %o

以 16 进制显示数字的转换说明为 %x

#include <stdio.h>

int main(void)
{
    int ten = 10;
    printf("dec = %d , hex = %x\n" , ten , ten);
    printf("dec = %d , Octal = %o\n" , ten , ten);
    return 0;
}
  1. int 的大小? 程序运行时,int 类型的数据在计算机内存中占用 4 个字节

查看某数据类型的大小

sizeof()
#include <stdio.h>

int main(void)
{
    int ten = 10;
    printf("Size = %ld\n" , sizeof(ten));
    return 0;
}

double

double 数据类型对应的是现实世界里的小数

  1. 声明 double 变量:先写上 double,然后写变量名,最后加上一个分号。
double num;
  1. 赋值与初始化
// 赋值
double pi;
pi = 3.14;

// = 是赋值运算符
// 初始化, 就是在声明变量的时候为变量赋一个初始值
double pi = 3.14;
  1. 打印 double 值
double pi = 3.14;
// %lf 为 double 数据类型的转换说明
print("%lf\n" , pi);
  1. double 的大小? 程序运行时,double 类型的数据在计算机内存中占用 8 个字节
#include <stdio.h>

int main(void)
{
    double pi = 3.14;
    printf("Size = %ld\n" , sizeof(pi));
    return 0;
}

char 类型

char 类型用于存储字符,但是从技术层面看,char 是整数类型,即 char 类型实际存储的是整数而不是字符。

计算机使用编码来处理字符,即用特定的整数表示特定的字符。美国最常用的编码是 ASCII 编码,本课程也使用此编码

标准 ASCII 码的范围为 0-127,只需 7 位二进制数即可表示。char 数据类型大小为 1 个字节(8位),因此容纳标准 ASCII 码绰绰有余。

  1. 声明 char 变量:先写上 char,然后写变量名,最后加上一个分号。
char a;
  1. 赋值与初始化
// 赋值
char a;
a = '1';
// 初始化, 就是在声明变量的时候为变量赋一个初始值
char a = '1';
  1. 打印 char 前面介绍过,一个字符变量实际上被存储为 1 字节的整数值,因此使用 %d 转换说明打印 char 类型变量的值,是一个整数。而 %c 转换说明打印的是该整数值在 ASCII 编码表里对应的字符

  2. 示例程序 2

#include <stdio.h>

int main(void)
{
    char ch = 0;
    printf("Please enter a character.\n");
    // 用户输入字符
    scanf("%c" , &ch); 
    printf("The code for %c is %d.\n" , ch , ch);
    return 0;
}
  1. char 的大小 程序运行时,char 类型的数据在计算机内存中占用 1 个字节
#include <stdio.h>

int main(void)
{
    char ch = '1';
    printf("Size = %ld\n" , sizeof(ch));
    return 0;
}

作业

1. 查阅资料,找到 ASCII 编码表,重点学习以下内容

  1. 字符 ‘0’, ‘1’, ‘2’ … ‘9’ 这 10 个字符在 ASCII 编码表中对应的十进制数字是多少?
  2. 字符 ‘A’, ‘B’, ‘C’ .. ‘Z’ 这 26 个字符在 ASCII 编码表中对应的十进制数字是多少?
  3. 字符 ‘a’, ‘b’, ‘c’ .. ‘z’ 这 26 个字符在 ASCII 编码表中对应的十进制数字是多少?

使用 示例程序2 验证你的想法

2. 写一个程序

定义两个 int 数据类型,变量名分别为 num_1 和 num_2, 值分别为 1 和 2, 利用 printf 函数将这两个 int 数据类型的值打印出来;思考如何将这 num_1 和 num_2 的值互换,使得值分别为 2 和 1,利用 printf 函数将互换后的值打印出来,验证你的想法。