6.变量的本质

6.变量的本质


6.1 知识点

变量类型回顾

有符号类型:

  • signed short / int:取值范围从 -32768 到 32767。
  • signed int:取值范围从 -21亿多 到 21亿多。
  • signed long / int:取值范围从 -21亿多 到 21亿多,或从 -9223亿亿多 到 9223亿亿多。
  • signed long long / int:取值范围从 -9223亿亿多 到 9223亿亿多。

无符号类型:

  • unsigned short / int:取值范围从 0 到 65535。
  • unsigned int:取值范围从 0 到 42亿多。
  • unsigned long / int:取值范围从 0 到 42亿多,或从 0 到 18446亿亿多。
  • unsigned long long / int:取值范围从 0 到 18446亿亿多。

浮点数:

  • float:取值范围从 -3.4 * 10^38 到 3.4 * 10^38,有效数字为 6/7 位。
  • double:取值范围从 -1.7 * 10^-308 到 1.7 * 10^308,有效数字为 15/16 位。
  • long double:取值范围从 -1.1 * 10^-4932 到 1.1 * 10^4932 等,有效数字为 18/21 位,或 33/36 位。

特殊类型:

  • bool:值为 truefalse,用 1 和 0 来表示。
  • char:表示一个字符,采用 ASCII 编码。
  • string:表示一串字符。

变量的存储空间

计算机中最小的存储单位是“位”(bit),具体的存储关系如下:

  • 1 byte = 8 bit(字节 = 8 位)
  • 1 KB = 1024 byte(千字节 = 1024 字节)
  • 1 MB = 1024 KB(兆字节 = 1024 千字节)
  • 1 GB = 1024 MB(吉字节 = 1024 兆字节)
  • 1 TB = 1024 GB(太字节 = 1024 吉字节)

通过 sizeof(变量类型) 运算符可以获取变量类型所占的内存空间(单位:字节)。

有符号类型:

  • short:所占字节数为 2 byte。
  • int:所占字节数为 4 byte。
  • long:所占字节数为 4 byte。
  • long long:所占字节数为 8 byte。

无符号类型:

  • unsigned short:所占字节数为 2 byte。
  • unsigned:所占字节数为 4 byte。
  • unsigned long:所占字节数为 4 byte。
  • unsigned long long:所占字节数为 8 byte。

浮点数:

  • float:所占字节数为 4 byte。
  • double:所占字节数为 8 byte。
  • long double:所占字节数为 8 byte。

特殊类型:

  • bool:所占字节数为 1 byte。
  • char:所占字节数为 1 byte。
  • string:由于存储的内容可变,通常不通过 sizeof 查看其内存空间大小。string 中不仅会存储字符串本身的信息,还会存储一些字符串的基本信息(如指针、长度信息、容量信息等)。在某些编译器下,string 的大小可能为 40 byte。

变量的本质:二进制

变量的本质是二进制——计算机中所有数据的本质都是二进制,即一堆 0 和 1。

为什么是二进制?

数据传递只能通过电信号,而电信号只有两种状态:开(1)和关(0)。因此,二进制(0 和 1)是用来表示这两种状态的最简单方式。

在计算机中,最小的存储单位是位(bit),每个位只能表示 0 或 1。

  • 1 bit 只能表示一个数,要么是 0,要么是 1。
  • 为了方便表示数据,我们使用字节(byte)这一存储单位,它是由 8 个 bit 组成的。
  • 1 byte = 8 bits。例如,0000 0000 就是一个字节的二进制表示。

二进制与十进制的对比与转换

在计算机中,所有的数据最终都需要转换成二进制形式存储和处理。二进制和十进制之间的转换是非常常见的操作,我们可以通过以下方式进行对比和转换:

  • 二进制:每一位(bit)代表一个 2 的幂次方,按位展开即可得出数值。
  • 十进制:每一位代表一个 10 的幂次方,通过求和计算得到最终数值。

例如:

  • 二进制 101 可以转换为十进制 5
  • 十进制 10 可以转换为二进制 1010

以下是更复杂的例子:


理解二进制的基础有助于我们更好地理解计算机如何存储和处理数据。


6.2 知识点代码

Lesson06_变量的本质.cpp

#include <iostream>
using namespace std;
int main()
{
    cout << "变量的本质\n";

    #pragma region 变量类型回顾

    //有符号
    //[signed] short [int]      (-32768 ~ 32767)
    //[signed] int              (-21亿多 ~ 21亿多)
    //[signed] long [int]       (-21亿多 ~ 21亿多 或 -9223亿亿多 ~ 9223亿亿多 )
    //[signed] long long [int]  (-9223亿亿多 ~ 9223亿亿多)

    //无符号
    //unsigned short [int]      (0 ~ 65535)
    //unsigned [int]            (0 ~ 42亿多)
    //unsigned long [int]       (0 ~ 42亿多 或 0 ~ 18446亿亿多 )
    //unsigned long long [int]  (0 ~ 18446亿亿多 )

    //浮点数
    //float         (-3.4*10^-38 ~ 3.4*10^38)       (6/7位有效数字)      
    //double        (-1.7*10^-308 ~ 1.7*10^308)     (15/16位有效数字)
    //long double   (-1.1*10^-4932 ~ 1.1*10^4932等) (18/21、33/36位有效数字)         

    //特殊
    //bool   (true1和false  0和1)
    //char   (一个字符, ASCII编码)
    //string (一串字符)

    #pragma endregion

    #pragma region 知识点一 变量的存储空间(内存中)

    //计算机中最小的存储单位为"位"(bit)
    // 1byte = 8bit                 1字节     = 8位
    // 1KB   = 1024byte             1千字节   = 1024字节
    // 1MB   = 1024KB               1兆字节   = 1024千字节
    // 1GB   = 1024MB               1吉字节   = 1024兆字节
    // 1TB   = 1024GB               1太字节   = 1024吉字节

    // 通过sizeof(变量类型)运算符 可以获取变量类型所占的内存空间(单位:字节)

    //有符号
    cout << "有符号" << endl;
    //[signed] short [int]      (-32768 ~ 32767)
    cout << "short所占字节数:" << sizeof(short) << "byte" << endl;//2byte
    //[signed] int              (-21亿多 ~ 21亿多)
    cout << "int所占字节数:" << sizeof(int) << "byte" << endl;//4byte
    //[signed] long [int]       (-21亿多 ~ 21亿多 或 -9223亿亿多 ~ 9223亿亿多 )
    cout << "long所占字节数:" << sizeof(long) << "byte" << endl;//4byte
    //[signed] long long [int]  (-9223亿亿多 ~ 9223亿亿多)
    cout << "long long所占字节数:" << sizeof(long long) << "byte" << endl;//8byte

    //无符号
    cout << "无符号" << endl;
    //unsigned short [int]      (0 ~ 65535)
    cout << "unsigned short所占字节数:" << sizeof(unsigned short) << "byte" << endl;//2byte
    //unsigned [int]            (0 ~ 42亿多)
    cout << "unsigned所占字节数:" << sizeof(unsigned) << "byte" << endl;//4byte
    //unsigned long [int]       (0 ~ 42亿多 或 0 ~ 18446亿亿多 )
    cout << "unsigned long所占字节数:" << sizeof(unsigned long) << "byte" << endl;//4byte
    //unsigned long long [int]  (0 ~ 18446亿亿多 )
    cout << "unsigned long long所占字节数:" << sizeof(unsigned long long) << "byte" << endl;//8byte

    //浮点数
    cout << "浮点数" << endl;
    //float         (-3.4*10^-38 ~ 3.4*10^38)       (6/7位有效数字) 
    cout << "float所占字节数:" << sizeof(float) << "byte" << endl;//4byte
    //double        (-1.7*10^-308 ~ 1.7*10^308)     (15/16位有效数字)
    cout << "double所占字节数:" << sizeof(double) << "byte" << endl;//8byte
    //long double   (-1.1*10^-4932 ~ 1.1*10^4932等) (18/21、33/36位有效数字)   
    cout << "long double所占字节数:" << sizeof(long double) << "byte" << endl;//8byte

    //特殊
    cout << "特殊" << endl;
    //bool   (true1和false  0和1)
    cout << "bool所占字节数:" << sizeof(bool) << "byte" << endl;//1byte
    //char   (一个字符, ASCII编码)
    cout << "char所占字节数:" << sizeof(char) << "byte" << endl;//1byte
    //string (一串字符)
    //注意:string由于存储的内容可变,因此我们一般不通过sizeof查看其内存空间大小
    //      string中不仅会存储字符串本身的信息,还会存储一些字符串的基本信息(比如指针、长度信息、容量信息等等)
    cout << "string所占字节数:" << sizeof(string) << "byte" << endl;//40byte

    #pragma endregion

    #pragma region 知识点二 变量的本质

    //变量的本质是2进制——>计算机中所有数据的本质都是二进制 是一堆0和1 
    // 
    //为什么是2进制?
    //数据传递只能通过电信号,只有开和关两种状态。所以就用0和1来表示这两种状态

    // 计算机中的存储单位最小为bit(位),他只能表示0和1两个数字
    // 1bit 就是1个数 要不是0要不是1
    // 为了方便数据表示
    // 出现一个叫byte(字节)的单位,它是由8个bit组成的存储单位。
    // 所以我们一般说一个字节为8位
    // 1byte = 0000 0000

    // 2进制和10进制的对比
    // 2进制和10进制之间的相互转换

    #pragma endregion
}

6.3 练习题

请默写出常用的14个变量类型他们所占用的内存空间

  1. 有符号的整型

    • short:2 byte,相当于 16 位,即 0000 0000 0000 0000 这样的表示形式。
    • int:4 byte,共 32 位,例如 0000 0000 0000 0000 0000 0000 0000 0000
    • long:4 byte,32 位。
    • long long:8 byte,64 位。
  2. 无符号整型

    • unsigned short:2 byte,16 位。
    • unsigned:4 byte,32 位。
    • unsigned long:4 byte,32 位。
    • unsigned long long:8 byte,64 位。
  3. 浮点数

    • float:4 byte,用于表示单精度浮点数。
    • double:8 byte,用于表示双精度浮点数。
    • long double:8 byte,同样用于表示精度较高的浮点数。
  4. 特殊类型

    • bool:1 byte,通常用于表示逻辑真(非 0 值)或逻辑假(0 值)。
    • char:1 byte,可用于存储单个字符的 ASCII 码等相关编码值。
    • string:可变的长度,用于存储字符序列,其长度根据实际存储的内容而定。

请将2进制11000111、001101、01010101转为10进制,写出计算过程

  1. 11000111
    1 + 2 + 4 + 64 + 128 = 199

  2. 001101
    1 + 4 + 8 = 13

  3. 01010101
    1 + 4 + 16 + 64 = 85

请将10进制99、1024、78937转为2进制,写出计算过程

  1. 99
    99 = 01100011

  2. 1024
    1024 = 0100 0000 0000

  3. 78937
    78937 = 0001 0011 0100 0101 1001


6.4 练习题代码

Lesson06_练习题.cpp

#include <iostream>
using namespace std;
int main()
{
    cout << "变量的本质 练习题\n";

    #pragma region 练习题一

    //请默写出常用的14个变量类型他们所占用的内存空间。
    // 
    // byte = 8bit = 0000 0000
    //1.有符号的整型
    // short        2byte
    // int          4byte
    // long         4byte
    // long long    8byte
    // 
    //2.无符号整型
    // unsigned short       2byte
    // unsigned             4byte
    // unsigned long        4byte
    // unsigned long long   8byte
    // 
    //3.浮点数
    // float                4byte
    // double               8byte
    // long double          8byte
    // 
    //4.特殊类型
    // bool                 1byte
    // char                 1byte
    // string               可变的

    #pragma endregion

    #pragma region 练习题二

    //请将2进制11000111、001101、01010101转为10进制,写出计算过程

    //11000111 =
    // 1 + 2 + 4 + 64 + 128 = 199

    //001101 =
    // 1 + 4 + 8 = 13

    //01010101 =
    // 1 + 4 + 16 + 64 = 85

    #pragma endregion

    #pragma region 练习题三

    //请将10进制99、1024、78937转为2进制,写出计算过程

    //99 = 01100011

    //1024 = 0100 0000 0000

    //78937 = 0001 0011 0100 0101 1001

    #pragma endregion

}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏