• 数据在内存中的存储(原反补码、大小端、浮点数)


    目录

    1. 整形在内存中的存储

    下面看几道题(整型提升、无符号数相关)

    2. 浮点型在内存中的存储


    1. 整形在内存中的存储

    原码、反码(符号位不变,其他位取反)、补码(反码+1)
    注:原码 → 补码(符号位不变,其他位取反,再+1)
           补码 → 原码(符号位不变,其他位取反,再+1)

    1. 无符号整型:三码合一
    2. 有符号整型的正数:三码合一
    3. 有符号整型的负数:计算机中存储的是补码

    内存中字节的顺序(小大端模式看不同的架构;):

    • 大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
    • 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

    设计一个代码来判断当前机器是大小端?

    1. int a = 1; // 0x 00 00 00 01(大端) 0x 01 00 00 00(小端)
    2. //来判断一下第一个字节是00还是01;
    3. //怎么获取第一个字节:通过char指针
    4. char* p =(char*)&a;//强制类型转换
    5. if(*p == 1)
    6. printf("小端排序\n");
    7. else
    8. printf("大端排序\n");

    数据在内存中的存储或读取,也就是内存的使用,是低地址→高地址,还是高地址→低地址?

    (先使用低地址,还是先使用高地址)

    下面看几道题(整型提升、无符号数相关)

    1. char a= -1;//a补码:11111111111111111111111111111111
    2. //char a: 11111111,有符号时候,
    3. signed char b=-1;
    4. //char b: 11111111
    5. unsigned char c=-1;
    6. //char c: 11111111
    7. printf("a=%d,b=%d,c=%d",a,b,c);
    8. //因为是%d,整型提升:
    9. //有符号数:高位补符号位
    10. //char a: 11111111
    11. //提升后:11111111111111111111111111111111 转化为原码后得:-1
    12. //a,b一样
    13. //无符号位,高位补0
    14. //00000000000000000011111111 = 255
    15. //答案 -1 -1 255
    1. char a = -128;
    2. //100000000000000000000000010000000
    3. //111111111111111111111111110000000补码
    4. //char a:10000000
    5. printf("%u\n",a);//%u是指unsigned int格式
    6. printf("%d\n",a);
    7. //整型提升(根据char是否有符号):
    8. //11111111111111111111111110000000 补码:打印是u%格式,不用转换;
    9. //11111111111111111111111101111111
    10. //10000000000000000000000010000000 = -128 打印%d格式
    1. unsigned int i;
    2. for(i = 9; i >= 0; i--)
    3. {
    4. printf("%u\n",i);
    5. }//循环9次后会进入循环
    6. //定义i为无符号数,所以没有负数,i=0减1之后是一个大的正数;参考圆来表示无符号数和有符号数
    7. // 0 1 2 ..... 127 -128 -127 .....-1 0 1 2 .....
    8. // 0 1 2 ..... 255 0 1 .....255...
    1. char a[1000];
    2. int i;
    3. for(i=0; i<1000; i++)
    4. {
    5. a[i] = -1-i;
    6. }//此时a中是-1,-2,-3......,-1000
    7. //但是char中只能存储-127到128的数;所以-128之后就是127 126 ... 1 0
    8. printf("%d",strlen(a));//strlrn找到'\0'也就是0为止;一共255个
    1. unsigned char i = 0;
    2. for(i = 0;i<=255;i++)
    3. {
    4. printf("hello world\n");
    5. }//此循环会进入死循环:因为unsigned char 范围是0-255, 255+1=0;

    2. 浮点型在内存中的存储

    float f = 5.5;
    二进制101.1 = 1.011*2^2
    则符号位为0,指数为129(2+127,余码系统,通过偏移量127将指数都转换为正数),尾数为011,整数位的1不用存储
    0(1位) 10000001(8位) 01100000000000000000000(23位)
    0x 40 b0 00 00(内存展示的是16进制)
     

    根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:
    (-1)^S * M * 2^E
    (-1)^s 表示符号位,当 s=0 V 为正数;当 s=1 V 为负数。
    M 表示有效数字,大于等于 1 ,小于 2
    2^E 表示指数位。

  • 相关阅读:
    浅谈.net core如何使用EFCore为一个上下文注类型注入多个实例用于连接主从数据库
    STM32 使用内部晶振导致 Can 通讯异常
    模块化编程+LCD1602调试工具——“51单片机”
    分布式事务之CP架构、AP架构解决方案
    vue3项目搭建手册
    swagger踩坑之请求类不显示具体字段
    Linux 虚拟化技术 KVM
    Leetcoder Day32| 贪心算法part05
    Xilinx FPGA 7系列 GTX/GTH Transceivers (2)--IBERT
    关于参与阿里巴巴编程之夏Asoc-Nacos的感悟
  • 原文地址:https://blog.csdn.net/m0_60416282/article/details/125479406