• 重学c/c++之数据存储


    一:整形

    正常情况下

    正数在内存中的存储为补码

     char a=30;
    
    • 1

    00011110(计算机中的存储)

    负数在内存中的存储为补码。

     char a=-30;
    
    • 1

    10011110(原码)
    11100001(反码)
    11111011(计算机中的存储)

    注意的是当数据存在溢出的时候,会变成负数,如下图。

    int main() {
        char a=130;
        printf("%d",a);// -126
    }
    
    • 1
    • 2
    • 3
    • 4

    分析

    10000010(计算机中的存储)

    特殊情况下

    有符号

    unsigned char c=-1;
    
    • 1

    解释

    10000001(机器码)
    111111110(反码)
    111111111(补码,由于是无符号,符号变0,即01111111)

      char c=-2;//4294967294
    
    • 1

    10000000 00000000 00000000 00000010(机器码)
    11111111 11111111 11111111 11111101(反码)
    11111111 11111111 11111111 11111110 (补码,由于输出的是无符号位,所以直接输出,不需要转化)

    数据溢出()

    • 正数(负数)
     char a=129;
     printf("%d",a);//-127
    
    • 1
    • 2

    解释

    1000 0001(首先,会把129的机器码作为补码存储在内存中)
    1111 1111(减一求反得到原码,然后输出)
    如果只有最高位为负数,则直接加负号

    char a=-130;
    
    • 1

    解释

    1000 0010(首先,会把-130的机器码作为补码存储在内存中)
    1000 0001(减一)
    0111 1110 2+4+8+16+32+64=126 (得到原码)

    补充

    大端存储:数据的低位保存在内存的高位中,而数据的高位保存在内存大地位中。
    小端存储:数据的低位保存在内存的高位中,而数据的高位保存在内存大地位中。

    //设计一个小程序来判断当前机器的字节序
    Bool checkSys(){
    int a=1;
    return*char *&i);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二:浮点型

    根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

    (-1) ^ S * M * 2 ^ E

    其中:
    (-1) ^ S 表示符号位,当S=0,V为正数;当S=1,V为负数。
    M 表示有效数字,大于等于1,小于2。
    2 ^ E 表示指数。

    注:
    1、这里的有效数字范围是[1,2),可类比十进制中有效数字的范围是[1,10)。
    2、指数部分以2为底数,类比十进制中指数部分以10为底数。

    例如十进制中的5.0,写成二进制浮点数是101.0,用该形式表示就是(-1) ^ 0 * 1.01 * 2 ^ 2
    (其中S = 0, M = 1.01, E = 2)表示成二进制为01000000101000000000000000000000,下图为机器验证。
    十六进制表示

    又如十进制中的-5.5,写成二进制浮点数是101.1(此处小数点后的第一位权重是2 ^(-1),也就是0.5,所以此处是1),用该形式表示就是(-1) ^ 1 * 1.011 * 2 ^ 2(其中S = 1, M = 1.011, E = 2)表示成二进制为11000000101100000000000000000000下图为机器验证。

    在这里插入图片描述

    在这里插入图片描述

    E全为0时

    由于E加上后127为全0,也就是说E的真实值为-127,即该浮点数指数部分是2 ^ (-127),显然这是一个极小的数,此时有效数字M不再加上第一位的1,而是还原为以0为整数的小数。这样做是为了表示±0,以及接近于0的很小的数字。

    E全为1时
    由于E加上后127为全1,也就是说E的真实值为128,即该浮点数指数部分是2 ^ (128),显然这是一个极大的数,此时表示正负无穷大(正负号由S决定)

    中以32位浮点数为例,64位浮点数同理

  • 相关阅读:
    replace、replaceAll、replaceFirst的区别
    docker安装
    生命科学领域 - FAIR原则和如果使数据FAIR化
    Win11怎么彻底关闭粘滞键功能
    uniapp集成windicss的流程
    为什么开源大模型终将胜出?
    【图像插值】基于稀疏拉普拉斯滤波器处理红绿蓝三种像素实现插值效果附matlab代码
    Gartner 发布 2022 年人工智能技术成熟度曲线:复合 AI、决策智能快速发展,因果 AI 是热点
    ubuntu16.04 gtx1080ti 安装pytorch
    【教程】应用侧连接华为云IoT平台
  • 原文地址:https://blog.csdn.net/qq_39109805/article/details/127619960