计算机数值表示

一、概述

近几日觉得理解计算机的数值表示对实际编程的理解有帮助,于是就回忆整理了以前的学的基础知识,主要来自《计算机原理》与《深入理解计算机系统》,本文讨论计算机整数表示与小数的定点法表示与十进制的映射.

二、整数

我们表达一个数都是用K进制数的方式,K进制数是一个指数,无符号模式的任i位上的数都可以表示为Ki*Ki-1。计算机是用二进制表示数的,因此它位上的通项公式为2i*2i-1。整数分为无符号与有符号两种,下面分别来讨论.

1、无符号整数

二进制的无符号整数与十进制的映射,直接用2i*2i-1对每一位进行求和即可。定义一个映射函数为(数学符号不会打,因此用手写的表示):

其值域为[0,2w-1].

2、有符号整数

计算机表示有符号整数通常有三种编码方式:原码、反码、补码。但一般用补码,因此下面主要讨论补码.

2.1、原码

所谓原码,就是指最高位充当符号位,不充当实际计数。定义一个映射函数为:

其最小值就是B2Uw-2取最大值,最高位为1时,为-2w-1+1,最大值就是B2Uw-2取最大值,最高位为0时,为2w-1-1,因此其值域为[-2w-1+1,2w-1-1].

2.2、反码

所谓反码,就是最高位充当权-(2w-1-1)参与计数。定义一个映射函数为:

其最小值就是B2Uw-2取0时,最高位取1时,为-2w-1+1,最大值就是B2Uw-2取最大值,最高位取0,为2w-1-1.因此其值域为[-2w-1+1,2w-1-1].

2.3、补码

我们从原码和反码的值域可以看出,它们的负域与正域都是对称,也就是能表示2w种状态,也就是有正0与负0,因此不够完美。在某一天,一个聪明的印度人发明了补码,完美的表示了有符号整数.

所谓补码,就是最高位充当权-2w-1参与计数。定义一个映射函数为:

其最小值为B2Uw-2取0时,最高位取1时,为-2w-1,最大值为B2Uw-2取最大值,最高位取0时,为2w-1-1,因此其值域为[-2w-1,2w-1-1].从值域可以看出,负域比正域多1,从而完美表示2w-1钟状态.

2.4、根据x求-x的补码

我们设B2Tw=-x,替换并左右移动可以得B2Uw-2=2w-1-x,从这可以看出-x的0到w-2位的无符号形式为2w-1-x,我们再把最高位权算进来得2*2w-1-x,也就是2w-x,欧,我们换种写法来看看:2w-1-x+1,等于什么意思?就是取反再加1.因此根据x的补码求-x的补码就是2w-x的无符号形式,也就是对x的进行取反加1操作.

2.5、有符号补码转无符号形式.

从B2Tw与B2Uw的对比可以看出,其差别就是前者多减了一个2w-1,少加了一个2w-1,因此只要补回来就行了,为x+2*2w-1=x+2w。反之,B2Uw------>B2Tw只要减两个2w-1就行了,为x-2w.

三、定点小数

所谓定点小数就是由程序员约定小数点在数的那一位,计算机不存储小数点的位置,也就是说将小数转为整数来存储,来运算,可以优化运算的性能(整数运算要比浮点快).

1、小数与定点小数互转

我们在日常手动计算时,常常通过将小数点右移将小数转为整数,算完再小数点左移相等的位置,也就是乘或除10n(n表示移动的位数),如0.25右移两位=0.25*102=25,25左移两位=25/102=0.25。右移也就表示保留几位小数.在计算机中只不过把10换为2罢了.但是二进制的右移并不总得一个整数,有余数时需要四舍五入,因此定点小数是有精度损失的,不过保留的小数越多,精度也就越高。我们定义小数为f,保留几位小数的定点小数为Qn,综上所述得:

Qn=f*2n;

f=Qn/2n;  C语言表示:int q=819;int n=1<<12;float f=(float)q/n;

2、定点小数运算

我们知道小数加减,小数点是不会变化的,因此定点小数的加减法与整数一样.而两个小数乘除法小数是会发生移动的,如0.2*0.3=0.06,1.25/0.5=2.5,而一个整数乘以一个小数,一个小数除以一个整数时小数点位不会发生移动。因此:

qn=f+f2=q1n+q2n;

qn=f-f2=q1n-q2n;

qn=f*f2=q1n*q2n/2n;   q2n/2n把q2n转为f2

qn=f/f2=q1n*2n/q2n;

时间: 2024-08-07 21:16:42

计算机数值表示的相关文章

一道题回顾计算机数值存储方式-原码,反码,补码

突然想到了计算机的补码,现在利用这个题目回顾一下相关知识点 unsigned char ch = -1; int val = ch; val的最终值是255: 换算成二进制一下,-1的源码:1000 0001,反码:1111 1110 ,负数在计算机中是以补码形式存储的,-1的补码:1111 1111 ch 变量是 无符号的,也就是整个补码的二进制位都是数值位,1111 1111 二进制位换算成十进制就是255,最终赋值给整数结果自然也是255 这道题目考察的就是计算机数值的存储方式,对于正数,

从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)

一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(int i) 含义:返回参数数值的补码形式,正数则忽略前面的0.(官方注释:返回表示传入参数的一个无符号(这里无符号大概单纯指数值前面没有+-号,实则是有符号位) 的二进制字符串.如果参数为负数x,返回的值则为 2^32 + x [就是它的补码]) 1.2 使用示例 System.out.printl

丢翻图方程组 最小解 计算机 数值求解

我写了一个 程序  DiophantusMin  , 用 数值方法 求解 丢翻图方程组 的 最小解    . 算法 是  跨越逼近法,    算法 和 原理 见 <二元隐函数 数值求解>   https://www.cnblogs.com/KSongKing/p/12109699.html     . 丢番图方程组 是 不定方程组,  求 整数解  .   DiophantusMin  只 求 最小解  ,   因为是 数值方法, 所以 严格的说, 是 未知数 绝对值 尽可能小 的 近似解 

什么是Complement(补码)?

大学上过计算机原理课程的朋友都接触过补码这个概念,不过当时书上所教授的内容都是以二进制作为前提,即所谓的2的补码(2's Complement).近来看TCP/IP Volume 1时,又接触到"1的补码"这个概念,忽然发现其实还不太明白补码到底是什么意思,故查阅资料记录之. 资料来源:维基百科 术语解释:Radix -- 基数,在本篇文章的范畴内等价于"进制" 定义:给出长度为n的数值y,则y的以基数b的补码为: bn - y   (即 b的补码) 水平有限,翻译

JAVA基础--JAVA语言组成01

  2.   标识符 2.1.   定义: 就是用来起到 标识作用的符号: (就是程序员对自己定义的东西起的名字) 2.2.   命名规则(语法规定的,必须遵守的): 1.可以由大小写字母.数字.下划线(_).美元符号($)组成: 2.数字不能开头: 3.关键字不能使用: 4.严格区分大小写   合法的标识符:name: _Abc; a, A;;clasz; 非法的标识符:0nae:1name; class : 2.3.   书写规范: 驼峰法: 1.类名:首字母大写:多个单词,每个单词首字母大

写给c#的初学者的点点滴滴(三)关于变量

一:什么是变量   变量就是为计算机软件存贮数据的.数据存贮在哪里?硬盘还是内存??这里要注意一件事情,凡是我们正在运行的程序,我们的数据保存一般都是在计算机内存中.而硬盘保存的是什么数据!其实硬盘在计算机体系结构中数据外部存贮设备.他们存贮的是计算机保存的原始数据.通常对硬盘上的数据操作我们成为输入输出操作(I/0)操作. 我们编程中所用到的变量即程序运行中在内存地址上存贮的数据.我们知道计算机可以存贮很多种数据,在计算机看来,数字,字符,图片,视频.......等等他们都是一种或多种数据格式

相对定位vs绝对定位

<!-- -->相对定位,position: relative; 它会,相对它原来的位置的坐标的左上角,进行偏移.同时,它原来的位置会被保留. (相对定位的html容器,它虽然已经脱离了普通的文档流,但它依然被视为普通文档流定位的一部分.) 口语化的描述,"我人不在这,但位置你得给我留着". <!-- --> 绝对定位,position:absolute; 它会,相对于整个文档的左上角原点的坐标,进行偏移.同时,它原来的位置,不会被保留. (就是被添加了绝对定位

连载29:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)

概率抽象 随机变量: 一个随机试验可能结果(称为基本事件)的全体组成一个基本空间Ω.随机变量X是定义在基本空间Ω上的取值为实数的函数,即基本空间Ω中每一个点,也就是每个基本事件都有实轴上的点与之对应. 离散随机变量: 有些随机变量,它全部可能取到的不相同的值是有限个或可列无限多个,也可以说概率1以一定的规律分布在各个可能值上.这种随机变量称为"离散型随机变量". 数学分布: 在数学意义上,我们将分布函数的定义表述为:设X是一个随机变量,x是任意实数,函数F(x)=P(X≤x)称为X的分

一网打尽!每个程序猿都该了解的黑客技术大汇总

原文:一网打尽!每个程序猿都该了解的黑客技术大汇总 上面这个段子估计很多朋友都看过,程序员被黑过无数次,在其他人眼中,仿佛我们需要写得了木马,翻得了围墙,修得了电脑,找得到资源,但凡是跟计算机沾点边的,咱都得会才行. 段子归段子,言归正传,对于咱们程序员来说,多多少少了解一些信息安全的技术知识还是大有裨益的,不仅能了解一些计算机和网络的底层原理,也能反哺我们的开发工作,带着安全思维编程,减少漏洞的产生. 本文内容: - 网络安全 - SQL注入 - XSS攻击 - CSRF攻击 - DDoS攻击