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

《计算机系统基础》——数据的表示

文章目录

  • 《计算机系统基础》——数据的表示
    • 移码
    • 整数
      • 无符号整数 (Unsigned integer)
      • 带符号整数(Signed integer)
      • 测试代码
    • 浮点数
      • 表示范围
    • IEEE 754标准
      • 例子
      • 规格化数
        • 0
        • +∞/-∞
        • 非数
      • 非规格数

《计算机系统基础》——数据的表示

移码

🚀🚀移码:将每一个数值加上一个偏置常数。通常,当编码位数为n时,bias取 2n-1 或 2n-1-1。

🚀🚀比如当n为4的时候,bias= 23 ,所以-8 = 0000B(-8 + 8)。之所以要用移码,主要是为了便于浮点数加减运算时的对阶操作。

整数

🚀🚀说起整数,相信大家肯定有所了解,作为我们最早使用的数据类型,但是它并没有那么简单,接下来我们就来介绍一下。

无符号整数 (Unsigned integer)

🚀🚀在整数中,我们用 LSB来表示最低有效位,用MSB来表示最高有效位,之所以这样规定,主要就是在我们的整数中,一般最高位用来表示符号位。而无符号整数则没有符号位,所有的位都用来计数。我们常在一个数的后面加一个“u”或“U”表示无符号数。

带符号整数(Signed integer)

🚀🚀而带符号整数,则是用MSB来表示数符(0–正数,1–负数),并且是采用补码来表示带符号整数。

🚀🚀若同时有无符号和带符号整数,则C编译器将带符号整数强制转换为无符号数。

在这里插入图片描述

🚀🚀要注意带符号整数是采用补码来表示的,所以才能得到表中的数值。


🚀🚀在不同的规则下,编译器处理默认常量的类型也不一样,具体如下所示。

🚀🚀这个是c90,无符号整型与long long类型有所区别。

在这里插入图片描述

🚀🚀在C99规则下,则没有无符号整型。

在这里插入图片描述

测试代码

#include<stdio.h>

void main ()
{
    int x=-1 ;
    unsigned int u = 2147483648 ;

    printf ("x = %u = %d\n", x, x) ;
    printf ("u = %u = %d\n", u, u) ;

    if (-2147483648<2147483647)
        printf ("-2147483648 < 2147483647 is true\n") ;
    else
        printf ("-2147483648 < 2147483647 is false\n") ;

    if (-2147483648-1 < 2147483647)
        printf ("-2147483648-1 < 2147483647\n") ;
    else if(-2147483648-1 == 2147483647)
        printf ("-2147483648-1 == 2147483647\n") ;
    else
        printf ("-2147483648-1 > 2147483647\n") ;
}

🚀🚀如果在C90标准下,2147483648为unsigned int型,因此 “-2147483648 < 2147483647”按无符号数比较, 10……0B比01……1B大,结果为false。

🚀🚀而在ISO C99标准下 ,2147483648为long long型,因此 “-2147483648 < 2147483647”按带符号整数比较,10……0B比01……1B小,结果为true。

🚀🚀最后在C90运行结果如下所示。

x = 4294967295 = -1
u = 2147483648 = -2147483648
-2147483648 < 2147483647 is false
-2147483648-1 == 2147483647

浮点数

🚀🚀在我们学习浮点数之前,我们需要简单回想一下的科学计数法,因为我们的浮点数表示方法与科学计数法是类似的,接下来我们会详细的进行介绍。

在这里插入图片描述

表示范围

🚀🚀我们首先看一下32位浮点数的存放格式,我们可以看到,我们的第0位S,是用来存放符号位的,一般用1表示负数,用0表示正数;然后第1~8位为8位移码表示阶码E(偏置常数为128);然后第9 ~31位为24位二进制原码小数表示的尾数M。

🚀🚀肯定有人有疑问了,9 ~ 31明明只有23个数,为什么能够表达24位呢?其实答案很简单,因为规格化尾数的小数点后第一位总是1,故规定第一位默认的“1”不明显表示出来。

在这里插入图片描述

🚀🚀所以,我们就能得到32位浮点数能够表示的范围了,当阶码与尾数都为1的时候,尾数就是0.11…1 ,也就是(1-2-24) ,然后阶码就是(28 - 1)- 128。以此类推,我们也能得到最小的正数。需要我们注意的是,原码是对称的,所以32位浮点数表示的范围关于原点对称。

🚀🚀我们也能发现一个问题,就是32位浮点数只能表示数轴上的一部分,其他部分都是属于溢出的范围。于是为了能表示更多有效数字,我们也可以规定规格化数的小数点前为1!但是在这里就不详细介绍了。

最大正数:0.11…1 x 211…1 = (1-2-24) x 2127

最小正数:0.10…0 x 200…0 = (1/2) x 2-128

在这里插入图片描述

IEEE 754标准

🚀🚀因为早期的计算机会各自定义自己的浮点数格式,所以为了解决不同计算机之间的数据传输,IEEE成立委员制定了浮点数标准,也就是我们现在的IEEE 754标准。目前所有通用计算机都采用IEEE 754来表示浮点数。

🚀🚀首先我们来看一看IEEE 754标准的规格化数是长什么样子的:

🚀🚀规格化数:+/-1.xxxxxxxxxxtwo x 2Exponent,规定:小数点前总是 “1”。

在这里插入图片描述

🚀🚀接下来我们就来简单的介绍一下,首先是第0位(Sign bit),用1表示负数,用0表示正数;然后第1~8位为8位移码表示阶码E(偏置常数为127),但是值得我们注意的就是,在SP规格化阶码范围为0000 0001 (-126) ~ 1111 1110 (127);然后第9 ~31位为24位二进制原码小数表示的尾数M,同样也是默认小数点前为0,所以就使用23位来代表24位。

🚀🚀阶码中的全0和全1用来表示特殊值!

例子

🚀🚀接下来呢,我们就讲解一个例子来加强我们的理解:已知float型变量x的机器数为BEE00000H,求x的值是多少?

  1. 数符部分为一,说明这个数为负数。
  2. 阶码为: 0111 1101B,也就是125,然后减去偏置常数127,于是得到阶码为-2.
  3. 尾数数值部分为:1 + 2-1 + 2-2 = 1.75。(1是默认的,然后前两位1分别是2-1 + 2-2
  4. 最后得到这个数值为:-1.75x2-2 = - 0.4375。

规格化数

🚀🚀我们前面介绍的都是针对规格化形式的数,那么还有一些我们没有介绍的,接下来就针对这些数进行一个介绍。

0

🚀🚀当我们的阶码和尾数都为0的时候,用来表示0,但是值得注意的是,这个地方是区分+0和-0的。

+∞/-∞

🚀🚀当阶码为全1,尾数为全0的时候这个时候表示的无穷,也是有正无穷和负无穷的区别的。而且在这里面,无穷也是可以参与运算的。

非数

🚀🚀当程序中出现一些不允许的运算时,得到的结果就是非数(NaN),比如:Sqrt (- 4.0)。这个时候就是阶码全为1,尾数不全为0.

非规格数

🚀🚀非规格化数,其实就是规格的数无法表达的数,所以他们就是阶码为0,尾数不全为0。也就是0.0…0x2-126~ 0.1…1x2-126

在这里插入图片描述

🚀🚀对于非数值数据我们就不介绍了,感兴趣的同学可以去了解一下。

相关文章:

  • 2023-3-2 刷题情况
  • 【数据结构】八大经典排序总结
  • 嵌入式学习笔记——基于Cortex-M的单片机介绍
  • 把数组里面数值排成最小的数
  • CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)
  • Java并发简介(什么是并发)
  • 【uniapp】getOpenerEventChannel().once 接收参数无效的解决方案
  • 【蓝桥杯集训·每日一题】Acwing 3729. 改变数组元素
  • 集成电路相关书籍
  • 【项目】Vue3+TS CMS 基本搭建相关配置
  • KDHX-8700无线高压核相相序表
  • AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》
  • JVM类加载机制
  • ACM第一周---周训---题目合集.
  • Java网络编程之UDP和TCP套接字
  • Android系统模拟器绘制实现概述
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • ES6核心特性
  • JAVA多线程机制解析-volatilesynchronized
  • JS函数式编程 数组部分风格 ES6版
  • Linux链接文件
  • mysql常用命令汇总
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Shell编程
  • vue2.0项目引入element-ui
  • vuex 笔记整理
  • vue自定义指令实现v-tap插件
  • 排序算法学习笔记
  • 无服务器化是企业 IT 架构的未来吗?
  • 小程序测试方案初探
  • 自动记录MySQL慢查询快照脚本
  • ​ArcGIS Pro 如何批量删除字段
  • ​用户画像从0到100的构建思路
  • $().each和$.each的区别
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (六)c52学习之旅-独立按键
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (全注解开发)学习Spring-MVC的第三天
  • (四)模仿学习-完成后台管理页面查询
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)负载均衡,回话保持,cookie
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .bashrc在哪里,alias妙用
  • .NET CORE Aws S3 使用
  • .NET 动态调用WebService + WSE + UsernameToken
  • .net 获取url的方法
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET学习教程二——.net基础定义+VS常用设置
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /bin/bash^M: bad interpreter: No such file or directory
  • :=
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思