计算机中数的表示

2024-04-06 18:52
文章标签 计算机 表示 中数

本文主要是介绍计算机中数的表示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0. 简介

介绍计算机中数的表示方法,主要内容来自 c s a p p csapp csapp

1. 整数的表示

包括有符号整数与无符号整数的表示。

假设
w → = [ w n − 1 w n − 2 . . . w 0 ] \overrightarrow w=[w_{n-1}w_{n-2}...w_0] w =[wn1wn2...w0]
为一种整数。

1.1 无符号整数

计算机是二进制的,且数据长度固定。

所以无符号二进制数实际上直接表示即可。

B 2 U ( w → ) = ∑ i = 0 n − 1 w i × 2 i B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^{i} B2U(w )=i=0n1wi×2i

1.2 有符号整数
  1. 补码编码
    最高位来表示符号位
    B 2 T ( w → ) = − w n − 1 ∗ 2 n − 1 + ∑ i = 0 n − 2 w i × 2 i B2T(\overrightarrow w)=-w_{n-1}*2^{n-1}+\sum_{i=0}^{n-2}w_i\times2^i B2T(w )=wn12n1+i=0n2wi×2i
    所以范围为有符号整数范围为 − 2 n − 1 ∼ 2 n − 1 − 1 -2^{n-1}\sim 2^{n-1}-1 2n12n11

  2. 反码编码
    B 2 O ( w → ) = − w n − 1 ∗ ( 2 n − 1 − 1 ) + ∑ i = 0 n − 2 w i × 2 i B2O(\overrightarrow w)=-w_{n-1}*(2^{n-1}-1)+\sum_{i=0}^{n-2}w_i\times2^i B2O(w )=wn1(2n11)+i=0n2wi×2i

  3. 原码编码
    B 2 S ( w → ) = ( − 1 ) w n − 1 ⋅ ∑ i = 0 n − 2 w i × 2 i B2S(\overrightarrow w)=(-1)^{w_{n-1}} \cdot \sum_{i=0}^{n-2}w_i \times2^i B2S(w )=(1)wn1i=0n2wi×2i

为什么使用补码?原码和反码的表示中,对于 0 0 0的表示有歧义。 + 0 ( 0000 0000 ) +0(0000\ 0000) +0(0000 0000) − 0 ( 1000 0000 ) -0(1000\ 0000) 0(1000 0000)

1.3 有符号数与无符号数间转换

无符号数转有符号数
B 2 U ( w → ) = ∑ i = 0 n − 1 w i × 2 i = w n − 1 ∗ 2 n − 1 + ∑ i = 0 n − 2 w i × 2 i B 2 T ( w → ) = − w n − 1 ∗ 2 n − 1 + ∑ i = 0 n − 2 w i × 2 i \begin{align} B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^i=w_{n-1} *2^{n-1} +\sum_{i=0}^{n-2}w_i \times 2^i\\ B2T(\overrightarrow w)=-w_{n-1}*2^{n-1}+\sum_{i=0}^{n-2}w_i\times2^i \end{align} B2U(w )=i=0n1wi×2i=wn12n1+i=0n2wi×2iB2T(w )=wn12n1+i=0n2wi×2i
( 2 ) − ( 1 ) (2)-(1) (2)(1)得到
B 2 T ( w → ) − B 2 U ( w → ) = − w n − 1 ∗ 2 n B2T(\overrightarrow w)-B2U(\overrightarrow w)=-w_{n-1} *2^{n} B2T(w )B2U(w )=wn12n
所以
U 2 T ( w → ) = − w n − 1 ∗ 2 n + B 2 U ( w → ) U2T(\overrightarrow w)=-w_{n-1}*2^n+B2U(\overrightarrow w) U2T(w )=wn12n+B2U(w )
分类讨论下最高位情况
l e t u = B 2 U ( w → ) U 2 T ( u ) = { u , u ≤ T M a x n ( w n − 1 = 1 ) u − 2 n , u > T M a x n let\ u=B2U(\overrightarrow{w})\\ \begin{equation} U2T(u )= \begin{cases} u,\quad u \le TMax_{n}(w_{n-1} =1)\\ u-2^n,\quad u \gt TMax_{n} \end{cases} \end{equation} let u=B2U(w )U2T(u)={u,uTMaxn(wn1=1)u2n,u>TMaxn

同理可得有符号转无符号数
B 2 U ( w → ) = U 2 T ( w → ) + w n − 1 ∗ 2 n B2U(\overrightarrow w)=U2T(\overrightarrow w)+w_{n-1}*2^n B2U(w )=U2T(w )+wn12n
同样分类讨论最高位情况
l e t t = U 2 T ( w → ) T 2 U ( t ) = { t , t ≥ 0 ) t + 2 n , t < 0 let\ t=U2T(\overrightarrow w)\\ \begin{equation} T2U(t)= \begin{cases} t,\quad t \ge 0)\\ t+2^n,\quad t \lt 0 \end{cases} \end{equation} let t=U2T(w )T2U(t)={t,t0)t+2n,t<0

1.4 数位扩展

无符号数扩展,直接在前面添加 0 0 0即可。

u → = [ u n − 1 u n − 2 ⋯ u 0 ] u ′ → = [ 0 ⋯ u n − 1 ⋯ u 0 ] \overrightarrow u=[u_{n-1}u_{n-2}\cdots u_0]\\ \overrightarrow {u'}= [0\cdots u_{n-1}\cdots u_0] u =[un1un2u0]u =[0un1u0]
根据
B 2 U ( w → ) = ∑ i = 0 n − 1 w i × 2 i B2U(\overrightarrow w)=\sum_{i=0}^{n-1}w_i \times 2^{i} B2U(w )=i=0n1wi×2i
u → = u ′ → \overrightarrow {u}=\overrightarrow{u'} u =u

补码符号扩展,在前面不断添加最高位数字即可

证明
B 2 T t + k ( [ w t − 1 w t − 1 w t − 2 ⋯ w 0 ] ) = − 2 t + k − 1 ∗ w n − 1 + ∑ i = 0 t + k − 2 2 i ∗ w i = − 2 t + k − 1 ∗ w t − 1 + 2 t + k − 2 ∗ w t − 1 + ∑ i = 0 t + k − 3 2 i ∗ w i = − 2 t + k − 2 ∗ w t − 1 + ∑ i = 0 t + k − 3 2 i ∗ w i ⋯ = − 2 t − 1 ∗ w t − 1 + ∑ i = 0 t − 2 2 i ∗ w i = B 2 T t ( w t − 1 w t − 2 ⋯ w 0 ) \begin{align} B2T_{t+k}([w_{t-1}w_{t-1}w_{t-2}\cdots w_0]) &= -2^{t+k-1}*w_{n-1}+\sum_{i=0}^{t+k-2}2^{i} *w_i \nonumber\\ &= -2^{t+k-1}*w_{t-1}+2^{t+k-2}*w_{t-1}+\sum_{i=0}^{t+k-3}2^{i} *w_i \nonumber\\ &=-2^{t+k-2}*w_{t-1}+\sum_{i=0}^{t+k-3}2^{i} *w_i \nonumber\\ &\cdots \nonumber \\ &=-2^{t-1} *w_{t-1} + \sum_{i=0}^{t-2}2^{i} *w_i \nonumber \\ &= B2T_{t}(w_{t-1}w_{t-2}\cdots w_0) \nonumber \end{align} B2Tt+k([wt1wt1wt2w0])=2t+k1wn1+i=0t+k22iwi=2t+k1wt1+2t+k2wt1+i=0t+k32iwi=2t+k2wt1+i=0t+k32iwi=2t1wt1+i=0t22iwi=B2Tt(wt1wt2w0)

1.5 数位截断

无符号数的截断,直接取 k k k位即可。

证明
B 2 U t ( [ w t − 1 w t − 2 ⋯ w 0 ] ) m o d 2 k = [ ∑ i = 0 t − 1 w i ∗ 2 i ] m o d 2 k = [ ∑ i = 0 k − 1 w i ∗ 2 i ] m o d 2 k = [ ∑ i = 0 k − 1 w i ∗ 2 i ] = B 2 U k ( w k − 1 w k − 2 ⋯ w 0 ) \begin{align} B2U_t([w_{t-1}w_{t-2}\cdots w_0]) \bmod 2^k &=[\sum_{i=0}^{t-1}w_i *2^i] \bmod 2^k \nonumber\\ &= [\sum_{i=0}^{k-1}w_i *2^i] \bmod 2^k \nonumber\\ &= [\sum_{i=0}^{k-1}w_i *2^i] \nonumber\\ &= B2U_k(w_{k-1}w_{k-2} \cdots w_0)\nonumber\\ \end{align} B2Ut([wt1wt2w0])mod2k=[i=0t1wi2i]mod2k=[i=0k1wi2i]mod2k=[i=0k1wi2i]=B2Uk(wk1wk2w0)
利用了
∀ i > = k , 2 i m o d 2 k = 0 \forall i>=k, 2^i \bmod2^k=0 i>=k,2imod2k=0
有符号数(补码)的截断
B 2 T t ( [ w t − 1 w t − 2 ⋯ w 0 ] ) m o d 2 k = U 2 T t ( B 2 U t ( [ w t − 1 w t − 2 ⋯ w 0 ] ) ) m o d 2 k l e t u = B 2 U t ( [ w t − 1 w t − 2 ⋯ w 0 ] ) 根据公式 ( 3 ) = [ u − ( i × 2 t ) ] m o d 2 k = u m o d 2 k = U 2 T t ( B 2 U t ( [ w t − 1 w t − 2 ⋯ w 0 ] ) m o d 2 k ) \begin{align} B2T_t([w_{t-1}w_{t-2}\cdots w_0]) \bmod 2^k&= U2T_t(B2U_t([w_{t-1}w_{t-2}\cdots w_0])) \bmod 2^k \nonumber \\ &let\ u =B2U_t([w_{t-1}w_{t-2}\cdots w_0])\nonumber \\ 根据公式(3)\nonumber \\ &=[u-(i \times 2^{t})] \bmod 2^k\nonumber \\ &= u \bmod 2^k\nonumber\\ &= U2T_t(B2U_t([w_{t-1}w_{t-2}\cdots w_0])\bmod 2^k) \nonumber \\ \end{align} B2Tt([wt1wt2w0])mod2k根据公式(3)=U2Tt(B2Ut([wt1wt2w0]))mod2klet u=B2Ut([wt1wt2w0])=[u(i×2t)]mod2k=umod2k=U2Tt(B2Ut([wt1wt2w0])mod2k)

2. 整数的运算

2.1 整数加法

无符号整数加法

∀ x , y , 0 ≤ x , y < 2 w x + w u y = { x + y , x + y < 2 w x + y − 2 w , 2 w ≤ x + y < 2 w + 1 ( 溢出 ) \forall x,y, 0 \le x,y\lt2^w\\ x+^{u}_{w}y= \begin{cases} x+y, \quad x+y \lt 2^w\\ x+y-2^w,\quad 2^{w} \le x+y \lt 2^{w+1}(溢出) \end{cases} x,y,0x,y<2wx+wuy={x+y,x+y<2wx+y2w,2wx+y<2w+1(溢出)

检测无符号数
∀ x , y , 0 ≤ x , y < 2 w l e t s = x + w u y , s < x 则发生溢出。 溢出时, x + w u y = x + y − 2 w x , y < 2 w y − 2 w < 0 , x − 2 w < 0 x + y − 2 w < x , y + x − 2 w < y \forall x,y, 0 \le x,y\lt2^w\\ let\ s=x+^{u}_wy,s<x则发生溢出。\\ 溢出时,x+^{u}_wy=x+y-2^w\\ x,y \lt 2^w\\ y-2^{w} \lt 0,x-2^w \lt 0\\ x+y-2^w \lt x,y+x-2^w \lt y x,y,0x,y<2wlet s=x+wuys<x则发生溢出。溢出时,x+wuy=x+y2wx,y<2wy2w<0,x2w<0x+y2w<x,y+x2w<y
无符号数求反
− w u x = { 0 , x = 0 2 w − x , x ≠ 0 -^u_wx= \begin{cases} 0, \quad x=0\\ 2^w-x, x \ne 0 \end{cases} wux={0,x=02wx,x=0

补码加法
∀ x , y , − 2 w − 1 ≤ x , y ≤ 2 w − 1 − 1 x + w t y = { x + y − 2 w , 2 w − 1 ≤ x + y x + y , − 2 w − 1 ≤ x + y ≤ 2 w − 1 x + y + 2 w , x + y ≤ − 2 w − 1 \forall x,y, -2^{w-1} \le x, y \le 2^{w-1} -1\\ x+^{t}_{w}y= \begin{cases} x+y-2^w, \quad 2^{w-1}\le x+y\\ x+y,\quad -2^{w-1} \le x+y \le 2^{w-1}\\ x+y+2^{w},\quad x+y\le -2^{w-1} \end{cases} x,y,2w1x,y2w11x+wty= x+y2w,2w1x+yx+y,2w1x+y2w1x+y+2w,x+y2w1
由于补码表示与无符号位表示相似

则我们可以转换为无符号再进行计算

x + w t y = U 2 T w ( T 2 U w ( x ) + T 2 U w ( y ) ) = U 2 T w [ ( x w − 1 2 w + x + y w − 1 2 w + y ) m o d 2 w ] = U 2 T w [ ( x + y ) m o d 2 w ] \begin{align} x+^t_wy&= U2T_w(T2U_w(x)+T2U_w(y)) \nonumber \\ &= U2T_w[(x_{w-1}2^w+x+y_{w-1}2^w+y) \bmod 2^w]\nonumber \\ &= U2T_w[(x+y) \bmod 2^w]\nonumber \\ \end{align} x+wty=U2Tw(T2Uw(x)+T2Uw(y))=U2Tw[(xw12w+x+yw12w+y)mod2w]=U2Tw[(x+y)mod2w]
检测补码加法中的溢出
s = x + w t y x > 0 , y > 0 , s ≤ 0 , 正溢出 x < 0 , y < 0 , s ≥ 0 负溢出 s=x+^t_wy\\ x \gt 0, y \gt 0,s\le0,正溢出\\ x \lt 0,y\lt 0,s \ge 0负溢出 s=x+wtyx>0,y>0,s0,正溢出x<0,y<0,s0负溢出
补码的非
− w t x = { T m i n w , x = T m i n w − x , x > T m i n w -^t_wx = \begin{cases} Tmin_w, \quad x=Tmin_w\\ -x,\quad x \gt Tmin_w \end{cases} wtx={Tminw,x=Tminwx,x>Tminw

2.2 整数乘法

无符号乘法
x ∗ w u y = ( x ∗ y ) m o d 2 w x * ^u_wy=(x*y) \bmod 2^w xwuy=(xy)mod2w

补码乘法

x ∗ w t y = U 2 T w ( ( x ∗ y ) m o d 2 w ) x * ^t_wy=U2T_w((x*y) \bmod 2^w) xwty=U2Tw((xy)mod2w)

证明
T 2 B w ( x ∗ w t y ) = U 2 B w ( x ′ ∗ w t y ′ ) x ′ = x + x w − 1 2 w y ′ = y + y w − 1 w w ( x ′ ∗ y ′ ) m o d 2 w = ( x + x w − 1 2 w ) ( y + y w − 1 2 w ) m o d 2 w = ( x y ) m o d 2 w T2B_w(x*^t_wy)=U2B_w(x'*^t_wy')\\ x' = x +x_{w-1}2^w\\ y' = y+y_{w-1}w^w\\ (x' * y') \bmod 2^w= (x +x_{w-1}2^w)(y+y_{w-1}2^w) \bmod 2^w=(xy) \bmod 2^w T2Bw(xwty)=U2Bw(xwty)x=x+xw12wy=y+yw1ww(xy)mod2w=(x+xw12w)(y+yw12w)mod2w=(xy)mod2w
乘以2的 k k k次幂,左移 k k k
B 2 U w + k ( [ x w − 1 x w − 2 ⋯ 0 ] ) = ∑ i = 0 w − 1 x i 2 i + k = [ ∑ i = 0 w − 1 x i 2 i ] × 2 k = x 2 k B2U_{w+k}([x_{w-1}x_{w-2}\cdots 0]) = \sum_{i=0}^{w-1}x_i2^{i+k}=[\sum_{i=0}^{w-1}x_i2^i]\times2^k=x2^k B2Uw+k([xw1xw20])=i=0w1xi2i+k=[i=0w1xi2i]×2k=x2k

3. 浮点数

3.1 浮点数表示

V = ( − 1 ) s × M × 2 E V=(-1)^s\times M \times2^E V=(1)s×M×2E
在内存中的布局
在这里插入图片描述

E = e − B i a s e = B 2 U ( e k − 1 e k − 2 ⋯ e 0 ) B i a s = 2 k − 1 − 1 f = B 2 U ( [ f n − 1 f n − 2 ⋯ f 0 ] ) / 2 n E=e-Bias\\ e=B2U(e_{k-1}e_{k-2}\cdots e_0)\\ Bias=2^{k-1}-1\\ f=B2U([f_{n-1}f_{n-2} \cdots f_0])/2^{n} E=eBiase=B2U(ek1ek2e0)Bias=2k11f=B2U([fn1fn2f0])/2n
总体分三种情况

  1. 标准化值
    阶码部分不全为0或不全为1
    M = 1 + f M=1+f M=1+f
  2. 非标准化值
    阶码部分全为0
    M = f M=f M=f
  3. 特殊值
    阶码全为1,小数域全为0,对应 − ∞ , + ∞ -\infin ,+\infin ,+,
    小数域非0,对应 N a N NaN NaN,表示不是一个数。

这篇关于计算机中数的表示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880572

相关文章

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

计算机视觉工程师所需的基本技能

一、编程技能 熟练掌握编程语言 Python:在计算机视觉领域广泛应用,有丰富的库如 OpenCV、TensorFlow、PyTorch 等,方便进行算法实现和模型开发。 C++:运行效率高,适用于对性能要求严格的计算机视觉应用。 数据结构与算法 掌握常见的数据结构(如数组、链表、栈、队列、树、图等)和算法(如排序、搜索、动态规划等),能够优化代码性能,提高算法效率。 二、数学基础

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

【python计算机视觉编程——7.图像搜索】

python计算机视觉编程——7.图像搜索 7.图像搜索7.1 基于内容的图像检索(CBIR)从文本挖掘中获取灵感——矢量空间模型(BOW表示模型)7.2 视觉单词**思想****特征提取**: 创建词汇7.3 图像索引7.3.1 建立数据库7.3.2 添加图像 7.4 在数据库中搜索图像7.4.1 利用索引获取获选图像7.4.2 用一幅图像进行查询7.4.3 确定对比基准并绘制结果 7.

【python计算机视觉编程——8.图像内容分类】

python计算机视觉编程——8.图像内容分类 8.图像内容分类8.1 K邻近分类法(KNN)8.1.1 一个简单的二维示例8.1.2 用稠密SIFT作为图像特征8.1.3 图像分类:手势识别 8.2贝叶斯分类器用PCA降维 8.3 支持向量机8.3.2 再论手势识别 8.4 光学字符识别8.4.2 选取特征8.4.3 多类支持向量机8.4.4 提取单元格并识别字符8.4.5 图像校正

Python计算机视觉编程 第十章

目录 一、OpenCv基础知识 1.读取和写入图像 2.颜色空间 3.显示图像和结果 二、处理视频 1.输入视频 2.将视频读取到NumPy数组中 三、跟踪 1.光流 2.Lucas-Kanade算法 一、OpenCv基础知识 OpenCV 自带读取、写入图像函数以及矩阵操作和数学库。 1.读取和写入图像 import cv2# 读取图像im = c

从计组中从重温C中浮点数表示及C程序翻译过程

目录 移码​编辑  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 例子:   ​编辑 浮点数取的过程   C程序翻译过程 移码  传统浮点表示格式 浮点数的存储(ieee 754)->修炼内功 根据国际标准IEEE(电⽓和电⼦⼯程协会)  32位 例子:    64位    IEEE754对有效数字M和

2025届计算机毕业设计:如何构建Java SpringBoot+Vue个人健康档案管理系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 | SpringBoot/SSM Python实战项目 | Django 微信小程序/安卓实战项目 大数据实战项目 ⚡⚡文末获取源码 文章目录