当前位置: 首页 > news >正文

【计算机系统基础3】数据的存储与运算

【计算机系统基础3】数据的存储与运算

  • 3.程序调试与实践:数据存储与运算
    • 3.1真值与机器数
      • 3.1.1整数的编码
    • 3.2数据的存储
    • 3.3数组的对齐
    • 3.4数据类型的转换
      • 3.4.1整数之间的数据类型转换
      • 3.4.2整数与浮点数之间的转换
      • 3.4.3自动类型转换
    • 3.5浮点数的表示和运算--IEEE 754
      • 3.5.1 IEEE 754 浮点数基本格式
      • 3.5.2 IEEE 754 数据按置的分类(`float` 为例)
    • 3.6浮点数的表示和运算--尾数的舍入处理

3.程序调试与实践:数据存储与运算

3.1真值与机器数

真值: 数据在现实世界中的表示

机器数: 数据在计算机内部的二进制编码表示

温度:零下3.5度

习惯写法:-3.5 (数据的真值/数据的实际值)

3.1.1整数的编码

带符号整数:charshortintlong

无符号整数:unsigned charunsigned shortunsigned int

  • 示例代码1

    #include<stdio.h>int main()
    { int ai = 100,bi = 2147483648,ci = -100; // 2^31== 2147483648unsigned au = 100,bu = 2147483648,cu = -100;printf("ai=%d, bi=%d, ci=%d\n",ai,bi,ci);printf("au=%u, bu=%u, cu=%u\n",au,bu,cu);return 0;
    }
    
  • 示例代码1编译运行

    ./manu 
    ai=100, bi=-2147483648, ci=-100
    au=100, bu=2147483648, cu=4294967196
    

    问题:带符号整数 bi 的输出结果值为何是负数?

    无符号整数 cu,赋值-个负的数据后,cu 输出的结果为什么会是这个值?

    cu 在计算机中实际存储的内容是什么?

    image-20220613165810912

  • 反汇编查看示例1代码

    image-20220614142339789

    相同颜色为对应值

  • 问题回答

    bi 编码成为 0xffffff9c,符号位为1,为负数,所以输出为负数。

    cu 编码成为 0xffffff9c,对于无符号整数来说,换算成十进制就是 4294967196

    带符号整数: 补码image-20220614162442267

    无符号整数: 二进制编码image-20220614162450026

3.2数据的存储

  • 示例代码

    #include "stdio.h"
    void main()
    {char a = 100;short b = 100;int c = 100;int d = 0x12345678;printf("a=%0xH,b=%0xH,c=%0xH,d=%0xH\n", a, b, c, d);
    }
    
  • 调试

    (gdb) i r rsp rbp
    rsp            0x7ffffffedde0      0x7ffffffedde0
    rbp            0x7ffffffeddf0      0x7ffffffeddf0
    ...//执行完 int d = 0x12345678;
    (gdb) x/16xb $rsp
    0x7ffffffedde0: 0xe0    0xde    0xfe    0xff    0xff    0x64    0x64    0x00
    0x7ffffffedde8: 0x64    0x00    0x00    0x00    0x78    0x56    0x34    0x12
    

    变量在栈帧中的存储,因为系统是小端模式。

    大端方式:最高有效字节存放在低地址单元中,
    最低有效字节存放在高地址单元中。

    小端方式:最高有效字节存放在高地址单元中,
    最低有效字节存放在低地址单元中。

    image-20220614195202403

3.3数组的对齐

  • 示例代码

    #include "stdio.h"void main()
    {struct record{char a;int b;short c;char d;} R[2];R[0].a = 1;R[0].b = 2;R[0].c = 3;R[0].d = 4;R[1].a = 5;R[1].b = 6;R[1].c = 7;R[1].d = 8;printf("数据存储时的边界对齐");
    }
    
  • 调试

    ...//运行完R[1].d = 8;
    (gdb) x/32xb $rsp
    0x7ffffffeddd0: 0x01    0x00    0x00    0x00    0x02    0x00    0x00    0x00
    0x7ffffffeddd8: 0x03    0x00    0x04    0x08    0x05    0x00    0x00    0x00
    0x7ffffffedde0: 0x06    0x00    0x00    0x00    0x07    0x00    0x08    0x00
    0x7ffffffedde8: 0x00    0x8c    0x05    0x6b    0xb3    0xa8    0xe2    0x8c
    

    image-20220614204137305

image-20220614204232393

image-20220614204437791

不考虑对齐方式下:数组R占用 (1+4+2+1)x2=16 字节

对齐方式下:数组R占用 (1+3+4+2+1+1)x2=24 字节

相比于不对齐,每个数组多占用 4 个字节

  • 示例代码修改后

    #include "stdio.h"void main()
    {struct record{char a;char d;short c;int b;} R[2];R[0].a = 1;R[0].b = 2;R[0].c = 3;R[0].d = 4;R[1].a = 5;R[1].b = 6;R[1].c = 7;R[1].d = 8;printf("数据存储时的边界对齐");
    }
    
  • 调试

    (gdb) x/20xb  $rsp
    0x7ffffffeddd0: 0x01    0x04    0x03    0x00    0x02    0x00    0x00    0x00
    0x7ffffffeddd8: 0x05    0x08    0x07    0x00    0x06    0x00    0x00    0x00
    0x7ffffffedde0: 0xe0    0xde    0xfe    0xff
    

    image-20220614204739142

3.4数据类型的转换

3.4.1整数之间的数据类型转换

机器数之间的转换

赋值语句:b = a;

  • 情况一:相同宽度的两个整型数据之间的赋值

    • image-20220615131534395
    • ab 的机器数相同,真值不一定相同,取决于 ab 的数据类型
  • 情况二:将一个短的数据类型赋值给一个长的数据类型

    • image-20220615132937320

    • an01 序列复制在 b 的低 n 位,b的高 m-n 位由 a 的数据类型决定

      • n位无符号整数

      • image-20220615133053711

        将b的高 m-n 位置为0

      • n位带符号整数

      • image-20220615133311016

        将b的高 m-n 位置为 a 的符号位

  • 情况三:将一个长的数据类型赋值给一个短的数据类型

    • image-20220615133504167
    • a 的低 m 位的 01 序列赋值给 b ,丢弃 a 的高位部分
  • 示例代码

    #include "stdio.h"
    void main()
    {short si = -100;unsigned short usi = si;int i = usi;unsigned ui = usi;int i1 = si;unsigned ui1 = si;int i2 = 0x12348765;short si2 = i2;unsigned short usi2 = i2;int i3 = si2;int i4 = 4294967296;printf("si=%d,usi=%u,i=%d,ui=%u,i1=%d,ui1=%u\n", si, usi, i, ui, i1, ui1);printf("i2=%d,si2=%d,usi2=%u,i3=%d,i4=%d\n", i2, si2, usi2, i3, i4);
    }
    
  • 调试

    • 相同宽度的两个整型数据之间的赋值示例

      image-20220615140140028

    • 零扩展代码示例

      image-20220615140252629

    • 符号扩展示例

      image-20220615140616457

    • 截断

      image-20220615140756018

      image-20220615140917587

3.4.2整数与浮点数之间的转换

  • 示例代码

    #include<stdio.h>
    int main()
    {int i1=0x7fffffff,i2,itemp;float f1=0x987654321,f2,ftemp;ftemp = i1;i2 = ftemp;itemp = f1;f2 = itemp;printf("i1=%d,i2=%d,f1=%f,f2=%f\n",i1,i2,f1,f2);return 0;
    }
    
  • 整数到浮点数

    要进行数据编码格式上的转换,而不是机器数上的直接复制。

    image-20220622211902528

    image-20220623100547231

    没看太明白😕

  • 浮点数到整数

    image-20220623101820282

3.4.3自动类型转换

  • 示例代码

    #include<stdio.h>int f1(unsigned int n)
    {int sum = 1,power = 1;int i;for(i = 0;i <= n - 1;i++){power *= 2;sum += power;}return sum;
    }int main()
    {int sum;sum = f1(0);printf("sum=%d\n",sum);return 0;
    }
    
  • 执行后结果:死循环

    image-20220623111455271

    关键在于这儿的比较,in - 1 的比较会自动转换为无符号整型的比较,执行完 n - 1 后,n的数值(edx)如下

    image-20220623111644596

    这个数在无符号整型的比较下恒成立,所以为死循环

  • 修改内容

    #include<stdio.h>int f1(int n)//改为整型
    {int sum = 1,power = 1;int i;for(i = 0;i <= n - 1;i++) {power *= 2;sum += power;}return sum;
    }int main()
    {int sum;sum = f1(0);printf("sum=%d\n",sum);return 0;
    }
    

3.5浮点数的表示和运算–IEEE 754

3.5.1 IEEE 754 浮点数基本格式

  • float 类型,32 位的单精度浮点格式

    image-20220627144642691

  • double 类型,64 位的双精度浮点格式

    image-20220627150543133

3.5.2 IEEE 754 数据按置的分类(float 为例)

  • 分类五类,下图没有体现的是无定义数

image-20220627150835020

  • 各类值的编码

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Utc5JczA-1684569046231)(…/软件杯-高性能分析型连接查询/image-20220627151052118.png)]

  • 真值与机器数对应关系举例

    • 规格化数

      image-20220627155517620

    • 非规格化数

      image-20220627155618373

  • 示例程序

    #include "stdio.h"
    void main()
    {float finf1 = 4e38,finf2 = 5e38,finf3 = 6e38;         //正无穷大float fninf1 = -4e38, fninf2 = -5e38, fninf3 = -6e38; //负无穷大float fzero = 0, fnzero = -fzero;// 0,-0float fnormal1 = 5.0, fnormal2 = 0.1, fnnormal1 = -5, fnnormal2 = -0.1; //规格化数float ffrac = 1e-40, fnfrac = -1e-40;//非规格化数float fnan1 = finf1 + fninf1, fnan2 = -fnan1;//无定义数float finf4 = fnormal1 / fzero; //除以0,无穷大printf("%f %f %f\n", finf1, finf2, finf3);printf("%f %f %f\n", fninf1, fninf2, fninf3);printf("%f %f\n", fzero, fnzero);printf("%f %.20f \n%f %.20f\n", fnormal1, fnormal2, fnnormal1, fnnormal2);printf("%.50f\n%.50f\n", ffrac, fnfrac);printf("%f %f\n", fnan1, fnan2);printf("%f \n", finf4);
    }
    
  • 输出

    image-20220627164938665

  • 打印结果分析

    • 第一行

      image-20220627165028737

    • 第二行

      image-20220627165202867

    • 第三行

      image-20220627165230961

    • 第四行

      image-20220627165339065

    • 第五行

      image-20220627165430826

    • 第六行

      image-20220627165502995

    • 第七行

      image-20220627165624001

3.6浮点数的表示和运算–尾数的舍入处理

  • 以32位单精度浮点数格式为例(就近舍入法)

    image-20220627170958401

    image-20220627171408845

  • 示例代码

    #include <stdio.h>void main()
    {float a1 = 0x8000000, a2 = 0x8000001, a3 = 0x8000014, a4 = 0x8000017;float b1 = 0x8000019, b2 = 0x800000c, b3 = 0x800000d;float c1 = 0x8000008, c2 = 0x8000018;float g = 0.1;printf("a1=%xH,a2=%xH,a3=%xH,a4=%xH\n",(int)a1,(int)a2,(int)a3,(int)a4);printf("b1=%xH,b2=%xH,b3=%xH\n",(int)b1,(int)b2,(int)b3);printf("c1=%xH,c2=%xH\n",(int)c1,(int)c2);printf("g=%.20f",g);
    };
    
  • 编译运行

     ./floatround 
    a1=8000000H,a2=8000000H,a3=8000010H,a4=8000010H
    b1=8000020H,b2=8000010H,b3=8000010H
    c1=8000000H,c2=8000020H
    g=0.10000000149011611938
    

    a1. a2、a3、a4:输出值 ≤ 初始值, 舍操作
    b1、b2、b3:输出值 > 初始值, 入操作
    c1:输出值 < 初始值, 舍操作
    c2:输出值 > 初始值, 入操作
    g:输出值> 0.1, 0.1用机器数不可以精确表示,入操作

  • 分析

    • image-20220627173444480

    • image-20220627173506973

    • image-20220627173533371

相关文章:

【计算机系统基础3】数据的存储与运算

【计算机系统基础3】数据的存储与运算 3.程序调试与实践&#xff1a;数据存储与运算3.1真值与机器数3.1.1整数的编码 3.2数据的存储3.3数组的对齐3.4数据类型的转换3.4.1整数之间的数据类型转换3.4.2整数与浮点数之间的转换3.4.3自动类型转换 3.5浮点数的表示和运算--IEEE 7543…...

【算法】快速排序

目录 核心思想&#xff1a; 过程&#xff1a; 演示&#xff1a; 第一趟&#xff1a; 第二趟&#xff1a; 代码&#xff1a; 核心思想&#xff1a; 从待排序列中取一个元素作为中心&#xff0c;所有比它小或相等的元素一律放在前面&#xff0c; 所有比它大的元素放在后面&…...

【移动端网页布局】流式布局案例 ③ ( 实现搜索栏功能 | 伪元素选择器 | 子绝父相 | 外边距塌陷处理 | 二倍精灵图处理方案 )

文章目录 一、搜索栏样式及核心要点1、实现效果2、自动伸缩搜索栏实现3、搜索栏父容器设置4、搜索栏左右两侧的按钮盒子5、搜索栏盒子6、二倍精灵图处理方案 二、完整代码示例1、HTML 标签结构2、CSS 样式3、展示效果 一、搜索栏样式及核心要点 1、实现效果 上一篇博客中 , 完成…...

【C++修炼之路】30.可变参数模板包装器

每一个不曾起舞的日子都是对生命的辜负 C11之可变参数模板&&包装器 前言一.可变参数模板的首次登场二.参数包展开2.1 递归函数方式展开参数包2.2 逗号表达式展开参数包 三.容器的emplace方法四.包装器4.1 什么是function4.2 function包装器的作用4.3 function的实际用途…...

Linux防火墙之firewalld基础

一、firewalld概述 firewalld防火墙是Centos7系统默认的防火墙管理工具&#xff0c;取代了之前的iptables防火墙&#xff0c;也是工作在网络层&#xff0c;属于包过滤防火墙。 firewalld和iptables都是用来管理防火墙的工具&#xff08;属于用户态&#xff09;来定义防火墙的…...

GitLab CI/CD

CI/CD 简介 CI/CD 简单来说就是可以自动化编译、测试、打包我们的代码。 GitLab CICD的使用 首先需要安装gitlab-runner。 在GitLab 中&#xff0c;runners 是运行 CI/CD 作业的代理。我们的对代码的作业都是在runner上去执行的。我们可以在本地、服务器、等任意一个联网设…...

PHP复习资料(未完待续)

&#xff08;未完待续&#xff0c;请持续关注此板块&#xff09; 【计科三四】雪课堂PHP期末模拟题&#xff1a;https://ks.wjx.top/vm/tUAmjxq.aspx# 【计科一二】PHP第一章练习题 https://ks.wjx.top/vm/QnjHad4.aspx# 【计科一二】PHP第二章练习题 https://ks.wjx.top/vm/h2…...

【python】pytorch包(第二章)API使用与介绍

1> nn.Module &#xff08;用于构建模型的底层逻辑&#xff09; 介绍 nn.Module 是 torch.nn 中的一个类&#xff0c;是pytorch中自定义网络的基类 __init__需要调用super方法&#xff0c;继承父类属性和方法forward方法必须实现&#xff0c;用来定义网络的向前计算的过程…...

Linux驱动基础(SR501人体感应模块)

文章目录 前言一、SR501模块介绍二、设备树编写三、驱动编写1.确定主设备号2.编写file_operations结构体3.注册file_operations结构体4.出口函数编写5.probe函数和remove函数编写6.中断编写7.测试程序编写8.全部驱动程序 总结 前言 本篇文章将给大家介绍一下SR501驱动程序的编…...

Android Studio Flamingo (火烈鸟) 升级踩坑记录

由于想要验证Compose最新的debug特性&#xff0c;而我目前使用的版本&#xff08;Dolphin 小海豚&#xff09;不支持&#xff0c;查看官网说明需要最新版本&#xff0c;所以不得已进行了一下Android Studio版本升级&#xff0c;过程中遇到一些问题&#xff0c;本文仅做记录。&a…...

【JAVA凝气】异常篇

哈喽~大家好呀&#xff0c;这篇来看看JAVA异常篇。 目录 一、前言 二、Exception 异常 1、Java 的非检查性异常 2、Java 检查性异常类 三、Error 错误 四、捕获异常 五、多重捕获块 六、throws/throw 关键字 七、自定义异常类 八、图书推荐 一、前言 异常是程序中的一…...

C++中的函数模板

目录 1. 什么是函数模板&#xff1f; 2. 如何定义函数模板&#xff1f; 3. 如何使用函数模板&#xff1f; 4. 函数模板与函数重载的区别是什么&#xff1f; 5. 函数模板与类模板有何异同点&#xff1f; 1. 什么是函数模板&#xff1f; - 函数模板是一种通用的函数描述&…...

MapReduce【Shuffle-Combiner】

概述 Conbiner在MapReduce的Shuffle阶段起作用&#xff0c;它负责局部数据的聚合&#xff0c;我们可以看到&#xff0c;对于大数据量&#xff0c;如果没有Combiner&#xff0c;将会在磁盘上写入多个文件等待ReduceTask来拉取&#xff0c;但是如果有Combiner组件&#xff0c;我们…...

postman接口自动化测试

Postman除了前面介绍的一些功能&#xff0c;还有其他一些小功能在日常接口测试或许用得上。今天&#xff0c;我们就来盘点一下&#xff0c;如下所示&#xff1a; 1.数据驱动     想要批量执行接口用例&#xff0c;我们一般会将对应的接口用例放在同一个Collection中&#xf…...

历经70+场面试,我发现了大厂面试的套路都是···

今年的金三银四刚刚过去&#xff0c;我又想起了我在去年春招时面试了50余家&#xff0c;加上暑期实习面试了20余家&#xff0c;加起来也面试了70余场的面试场景了。 基本把国内有名的互联网公司都面了一遍&#xff0c;不敢说自己的面试经验很丰富&#xff0c;但也是不差的。 …...

可视区域兼容性问题的思考及方法封装

今日在复习可视化尺寸获取时突发奇想&#xff0c;为什么要在怪异模式下使用document.body.clientWidth&#xff0c;在标准模式下使用document.documentElement.clientWidth&#xff1f;以及是否在IE8及以下的版本中其中一个获取方式将返回undefined或0。  出于该问题的思考&am…...

安全工具 | CMSeeK [指纹识别]

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…...

Android新logcat使用技巧

Android新logcat使用技巧 logcat新UI出现后&#xff0c;我常困惑于怎么过滤log&#xff0c;和以前的UI差异比较大&#xff0c;新UI界面结构如下&#xff1a; 这个新的 logcat 的问题是如何过滤信息并不是很明显。 获取应用的日志信息 要获取我们当前调试应用的日志信息&…...

使用Makefile笔记总结

文章目录 一、简单了解Makefile1.1 Makefile示例1.2 基本规则1.3 make是如何工作的1.4 使用变量1.5 make自动推导 二、变量2.1 变量的定义和引用2.2 变量的两种高级用法2.3 override 和 define 关键字2.4 环境变量与目标变量2.5 自动变量 三、Makefile规则3.1 通配符3.2 目标依…...

npm下载依赖项目跑不起来--解决方案

code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: vue-element-admin4.4.0 npm ERR! Found: webpack4.46.0 npm ERR! node_modules/webpack npm ERR! webpack“^4.23.0” from the root project npm ERR! npm ERR! Coul…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...