变量存储

基本概念

  • 类型大小

    • 内置类型

      类型 类型名 占用字节
      char 字符型 1
      short 短整型 2
      int 整型 4
      long 长整型 4或8
      float 单精度浮点型 4
      double 双精度浮点型 8
    • 自定义类型

      在其他笔记中详细记录相关内容

  • 大小端字节序存储模式

    • 大端(储存)模式

      指字节数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

    • 小端(储存)模式

      指字节数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中

    • 大小端的意义

      对于位数大于8的处理器,由于寄存器的宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题,因此导致了大端存储模式和小端存储模式

      注:我的机器是小端存储模式(大部分消费者电脑都是)

    • 大小端存储实例

      • 存储实例

        int num = 0x11223344;
        // 存储效果:
        // 大端:低地址 -> 11 22 33 44 -> 高地址
        // 小端:低地址 -> 44 33 22 11 -> 高地址
      • 判断机器字节序(百度面试题)

        // 判断当前机器的字节序,小端返回1、大端返回0
        int check_sys() {
            int a = 1;
            return *(char *) (&a);
        }
  • 原码、反码、补码(整型)

    注:特别说明,原码、反码、补码是对整型而言的,浮点型有它自己的标准

    • 原码、反码、补码的意义

      在计算机系统中,数值(整数)一律用补码来表示和储存。使用补码,可以将符号位和数值域统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路

    • 转化规则

      1. 正整数、无符号数三者相同,都为数学意义上的二进制码
      2. 对于有符号负整数,原码的符号位不变,其他位依次按位取反,得到反码;反码+1,得到补码

整型的存储

  • 有符号整数的存储

    对于BYTE大小的变量而言,它的补码对应规则如下

    • 从 0000 0000 到 0111 1111,对应 0 到 127(所有正整数 + 0)
    • 从 1111 1111 到 1000 0001,对应 -1 到 - 127(大部分负整数)
    • 由于还有 1000 0000 这个特殊的补码,特别定义为 -128
    • 综上,BYTE大小的变量而言,取值范围为 \(-2^7\) 到 \(2^7 - 1\)

    注:常用的字节单位

    单位 全称 含义 / 说明 大小(字节) 大小(比特)
    BIT Bit(Binary digit) 比特,最小的信息单位 1/8 字节 1 比特
    BYTE Byte 字节,基本存储单位 1 字节 8 比特
    WORD Word 字,通常为 2 字节 2 字节 16 比特
    DWORD Double Word 双字,为 WORD 的 2 倍 4 字节 32 比特
    QWORD Quad Word 四字,为 DWORD 的 2 倍 8 字节 64 比特
  • 无符号整数的存储

    由于无符号整数原码、反码、补码相同,所以从 0000 0000 到 1111 1111,对应 0 到 255

    注:

    • 由于不同数据类型互相操作所带来的类型变化,请参阅其他笔记
    • 符号所带来的影响,往往比较容易忽略,例如判断 size_t 类型小于0

浮点型的存储

注:此小节内容比较原理向,仅做了解,对实际写代码没有过多用处

  • 浮点类型在内存中的存储方式

    根据IEEE754标准,任意一个二进制浮点数V可以表示成:\(V = (-1)^s * M * 2^E\)

    例如:十进制的-5.0,写成二进制时为101.0,即 \(1.01\times 2^2\)。那么,S=1,M=1.01,E=2

    注:

    • 32位浮点数的存储模式

    • 64位浮点数的存储模式

  • 参数介绍

    • \((-1)^S\)表示符号位。当 S=0 ,V为正数;当 S=1 ,V为负数

    • M表示有效数字,其中 \(1 \leq M < 2\)

    • \(2^E\) 表示指数位

  • 存储方式

    • M的存储

      因为M整数部分始终为1,故只需要存储小数部分即可

      小数部分,第n位小数表示2^(-n)

    • E的存储

      E是一个无符号整数。如果E为8位,则范围为0255,如果E为11位,则范围为02047

      我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定:存入内存时,E的真实值必须再加上一个中间数

      • 对于8位的E时,中间数为127
      • 对于11位的E,中间数为1023
      • 例如:\(2^{10}\)保存为32位浮点数时,M必须保存为10+127=137,即 1000 1001
    • E的取出

      • E非全0或全1

        E的存储值减去127(或1023)得到真实值。再将有效数字M加上整数位1

      • E全为0

        这时,浮点数的指数E等于1-127(1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示正负0,以及接近于0的很小的数字

      • E全为1

        这时,有效数字M全为0,表示正负无穷大

« 数组 ← 返回列表 指针 »