信息的表示与和处理

  • 自己想的小问题
  • 1. 信息存储
    • 十六进制表示
    • 数据大小
    • 寻址和字节顺序
    • 表示字符串
    • 表示代码
    • 布尔代数简介
    • C语言中的位级运算
    • C语言中的逻辑运算
    • C语言中的移位运算
  • 2. 整数表示
    • 整型数据类型
    • 无符号数的编码
    • 补码编码
    • 有符号数和无符号数之间的转化
    • C语言中的有符号数与无符号数
    • 扩展一个数字的位表示
    • 截断数字
    • 关于有符号数与无符号数的建议
  • 3. 整数运算
    • 无符号加法
    • 补码加法
    • 补码的非
    • 无符号乘法
    • 补码乘法
    • 乘以常数
    • 除以2的幂
  • 4. 浮点数
    • 二进制小数
    • IEEE 浮点表示
    • 数字示例
    • 整数值转为浮点数形式
    • 舍入
    • 浮点运算
    • C语言中的浮点数

自己想的小问题

我们知道常用的计算机信息就是 字符,数字(整数,浮点数)

  1. 整数(正负数)是如何表示的在计算机内存中?是无限大的吗?
  2. 小数是咋表示的,1/3 在计算机中小数能表示吗?
  3. 对于任意整型,说明 a&-a 的含义:
    答:a & -a = a&~(a-1) ,且通过 a&-a 能得到 a 倒数第一个 1 的位置(该位置上是 1,取 余全 0)

对于有 10个手指的人类来说,使用十进制表示法是很自然的事情,但是当构造存储和处理信息的机器时,二进制的值工作得更好。二值信号能够很容易地被表示、存储和传输,例如,可以表示为穿孔卡片上有洞或无洞、导线上的高电压或低电压,或者顺时针或逆时针的磁场。对二值信号进行存储和执行计算的电子电路非常简单和可靠,制造商能够在一个单独的硅片上集成数百万甚至数十亿个这样的电路。

当把位组合在一起,再加上某种解 释(interpretation),即给不同的可能位模式赋予含义,我们就能够表示任何有限集合的元素。

  • 使用一个二进制数字系统,我们能够用位组来编码非负数。
  • 通过使用标准的字符码,我们能够对文档中的字母和符号进行编码。

在本章中,我们将讨论这两种编码,以及表示负数和对实数近似值的编码。
我们研究三种最重要的数字表示。

  • 无符号(unsigned)编码基于传统的二进制表示法,表示大于或者等于零的数字。
  • 补码(two’s-complement)编码是表示有符号整数的最常见的方式,有符号整数就是可以为正或者为负的数字。
  • 浮点数(floating-point)编码是表示实数的科学记数法的以二为基数的版本

计算机用这些不同的表示方法实现算术运算,例如加法和乘法,类似于对应的整数和实数运算。

学习本章注意的问题:

  1. 算机的表示法是用有限数量的位来对一个数字编码,因此,当结果太大以至不能表示时,某些运算就会溢出(overflow)。溢出会导致某些令人吃惊的后果。例如,现在的大多数计算机(使用32位来表示数据类型int),计算表达式200300400*500会得出结果-884 901 888。
  2. 整数的计算机运算满足人们所熟知的真正整数运算的定律(交换律,优先级)。
  3. 浮点运算有完全不同的数学属性**。虽然溢出会产生特殊的值+无穷,但是一组正数的乘积总是正的。由于表示的精度有限,浮点运算是不可结合的。例如,在大多数机器上,C表达式(3.14+1e20))-1e20求得的值会是0.0,而3.14+(le20-le20)求得的值会是3.14。
  4. C++编程语言建立在C语言的基础之上,它们使用完全相同的数字表示和运算。本章中关于C的所有内容对C++都有效

整数运算和浮点数运算会有不同的数学属性是因为它们处理数字表示有限性的方式不同——整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的;而浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的。

1. 信息存储

大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的存储器单位,而不是在存储器中访问单独的位。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器(virtualmemory)。存储器的每个字节都由一个唯一的数字来标识,称为它的地址(address),所有可能地址的集合称为虚拟地址空间(virtual address space)。顾名思义,这个虚拟地址空间只是一个展现给机器级程序的概念性映像

实际的实现: 将随机访问存储器(RAM)、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。

十六进制表示

一个字节由8位组成。在二进制表示法中,它的值域是 00000000~1111111; 十进制整数表示,它的值域就是0~255。

16进制的出现原因: 二进制表示法太冗长,而十进制表示法与位模式的互相转化又很麻烦。
以16为基数,或者叫十六进制(hexadecimal)数,来表示位模式。十六进制(简写为"hex")使用数字’0’~’9’,以及字符’A’~’F’来表示16个可能的值。 一个字节的值域为00~FF。

16进制的书写表示: 在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符’A’~’F’既可以是大写,也可以是小写,甚至是大小写混合。例如,我们可以将数字FA1D37B。写作0xFAlD37B,

16进制与2进制的转化

  • 基本规则是4位一组做整合和拆分
  • 窍门是记住16进制数字的 A,C,F对应的十进制,其他字母根据相对未知来算。
  • 当值x是x=2的n次方,我们可以很容易地将x写成十六进制形式,只要记住x的二进制表示就是1后面跟n个0。十六进制数字0代表4个二进制0。所以,当n表示成 i+4j 的形式,其中 0≤i≤3 时,我们可以把x写成开头的十六进制数字为1(i=0)、2(i=1)、4(i=2)或者8(i=3),后面跟随着 j 个十六进制的0。比如,x=2048=2的11次方,我们有n=11=3+4×2,从而得到十六进制表示0x800。

16进制和10进制的转化

十进制和十六进制表示之间的转换需要使用乘法或者除法来处理一般情况。

将一个十进制数字 x 转换为十六进制:

  1. 可以反复地用16除x,得到一个商g和一个余数r,也就是x=q×16+r。
  2. 我们用十六进制数字表示的 r 作为最低位数字,并且通过对 q 反复进行这个过程得到剩下的数字。


十六机制转化为10进制:

  1. 用相应的16的幂乘以每个十六进制数字。

每台计算机都有一个字长(word size),指明整数和指针数据的标称大小(nominal size)。

因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。也就是说,对于一个字长为w位的机器而言,虚拟地址的范围为0~2",程序最多访问2"个字节。

数据大小


移植问题

许多程序的编写都假设为图 2-3中列出的32位机器对应的字节分配。随着64 位机器的日益普及,在将这些程序移植到新机器上时,许多隐藏的对字长的依赖性就会显现出来,成为错误。 比如,许多程序员假设一个声明为 int 类型的程序对象能被用来存储一个指针。这在大多数32位的机器上能正常工作,但是在一台64 位的机器上却会导致问题。

可移植建议

  1. 表达式sizeof(T)返回存储一个类型为T的对象所需要的字节数。使用sizeof,而不是一个固定的值,是向编写在不同机器类型上可移植的代码迈进了一步。

寻址和字节顺序

对于跨越多字节的程序对象,我们必须建立两个规则∶

  1. 这个对象的地址是什么
  2. 以及在存储器中如何排列这些字节。

对象地址
在几乎所有的机器上,多字节对象都被存储为连续的字节序列, 对象的地址为所使用字节中最小的地址。
举例: int的变量 x 的地址为 0x100, 地址表达式的 &x 的值为 0x100,那么x的4个字节就存储在存储器的 0x100, 0x101, 0x102, 0x103位置。

排列表示

  1. 选择在存储器按照最低有效字节到最高有效字节的顺序存储对象, 称为小端法。
  2. 按照从高有效字节到最低有效字节的顺序存储,称为大端法。

大端法是高位高地址,低位低地址,与我们常规书写方式排列一样。
小端法是低位高地址,高位低地址,与我们常规书写方式排列相反。

x = 0x01234567 不同排列的表示:

一些错误点:

对于大多数应用程序员来说,他们机器所使用的字节顺序是完全不可见的,无论为哪种类型的机器编译的程序都会得到同样的结果。不过有时候,字节顺序会成为问题。首先是在不同类型的机器之间通过网络传送二进制数据时,一个常见的问题是当小端法机器产生的数据被发送到大端法机器或者反方向发送时会发现,接收程序字里的字节成了反序的

表示字符串

C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。每个字符都由某个标准编码来表示。

最常见的是ASCII字符码。在使用ASCII码作为字符码的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据具有更强的平台独立性。

生成一张ascii表: man ascii

文本编码的Unicode标准:

基本编码,也称为 Unicode 的"统一字符集",使用32位来表示字符。这好像是要求文本串中每个字符要占用4个字节。不过,可以用一些替代编码,常见的字符只需要1个或2个字节,而不太常用的字符需要多一些的字节数。特别地,UTF-8表示将每个字符编码为一个字节序列,这样标准 ASCII字符还是使用和它们在 ASCI中一样的单字节编码,这也就意味着所有的ASCI字节序列用 ASCI码表示和用UTF-8表示是一样的。
Java 编程语言使用Unicode来表示字符串。对于C语言也有支持 Unicode的程序库。

表示代码

我们发现指令编码是不同的。不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程运行在不同的操作系统上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同机器和操作系统组合之间移植。
计算机系统的一个基本概念就是从机器的角度来看,程序仅仅只是字节序列。机器没有关干初始源程序的任何信息,除了可能有些用来帮助调试的辅助表以外。

布尔代数简介

我们可以将上述4个布尔运算扩展到位向量的运算,位向量就是有固定长度为w、由0和1 组成的串。位向量的运算可以定义成参数的每个对应元素之间的运算。

假设: a和b分别表示位向量【a-1,a,-2,…,ao】和【b,-1b.-2,…,b】。我们将a&b也定义为一个长度为w的位向量,其中第i个元素等于a&b,0≤i<w。可以用类似的方式将运算|、^和 ~ 扩展到位向量上。

位向量一个很有用的应用就是表示有限集合。我们可以用位向量【a(w-1),…,a(1), a(0)】编码任何子集A属于{0,1,…,w-1},其中a=1当且仅当i∈ A。

例如,(记住我们是把a(w-1),写在左边,而将a(0)写在右边),位向量a=【01101001】表示集合A={0,3,5,6},而b=【01010101】表示集合B={0,2,4,6}。使用这种编码集合的方法,布尔运算|和&分别对应于集合的并和交,而~对应于于集合的补。还是用前面那个例子,运算a&b得到位向量【01000001】,而A并 B={0,6}。

C语言中的位级运算

C语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是C语言所使用的;就是OR(或),&就是AND(与),~就是NOT(取反),而^就是EXCLUSIVE-OR(异或)。这些运算能运用到任何"整型"的数据类型上,也就是那些声明为char或者int的数据类型,无论它们有没有像 short、long、long long 或者unsigned 这样的限定词。

位级运算的一个常见用法就是实现掩码运算:

这里掩码是一个位模式,表示从一个字中选出的位的集合。让我们来看一个例子,掩码 0xFF(最低的8位为1)表示一个字的低位字节。位级运算x&0xFF 生成一个由 x的最低有效字节组成的值,而其他的字节就被置为0。比如,对干x=0x89ABCDEF,其表达式将得到0x000000EF。

可移植的全1掩码
表达式~0将生成一个全1的掩码,不管机器的字大小是多少。尽管对于一个32位机器来说,同样的掩码可以写成0xFFFFFFFF,但是这样的代码不是可移植的。

C语言中的逻辑运算

C语言还提供了一组逻辑运算符、&&和!,分别对应于命题逻辑中的 OR、AND和 NOT 运算。逻辑运算很容易和位级运算相混淆,但是它们的功能是完全不同的。逻辑运算认为所有非零的参数都表示TRUE,而参数0表示 FALSE。它们返回1或者0,分别表示结果为TRUE 或者为FALSE。以下是一些表达式求值的示例。

短路运算: 逻辑运算符 &&和 | 与它们对应的位级运算 &和|之间第二个重要的区别是,如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值。因此,例如,表达式 a&&5/a将不会造成被零除,而表达式 p&&*p++也不会导致间接引用空指针。

C语言中的移位运算

C语言还提供了一组移位运算,以便向左或者向右移动位模式。

  1. 对于一个位表示为【x(n-1), x (n-2), …x(0)】的操作数x,C表达式 x<<k 会生成一个值,其位表示为【x(n-k-1), x (n-k-2), …x(0), 0,… 0】。也就是说,x向左移动k位,丢弃最高的k位,并在右端补k个0。移位量应该是一个0~n-1 之间的值。移位运算是从左至右可结合的,所以x<<j<<k 等价于(x<<j)<<k。
  2. 有一个相应的右移运算 x>>k,但是它的行为有点微妙。一般而言,机器支持两种形式的右移∶逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是【0,…,0,xn-1,xn-2,…,xk】。算术右移是在左端补k个最高有效位的值,得到的结果是【xn-1,…,xn-1,xn-1,xn-2,…,xk】。这种做法看上去可能有点奇特,但是我们会发现它对有符号整数数据的运算非常有用。

可移植性问题

C语言标准并没有明确定义应该使用哪种类型的右移。对于无符号数据(也就是以限定词unsigned声明的整型对象),右移必须是逻辑的。而对于有符号数据(默认的声明的整型对象),算术的或者逻辑的右移都可以。

不幸的是,这就意味着任何假设一种或者另一种右移形式的代码都潜在着可移植性问题。然而,实际上,几乎所有的编译器/机器组合都对有符号数据使用算术右移,且许多程序员也都假设机器会使用这种右移。

2. 整数表示

在本节中,我们描述用位来编码整数的两种不同的方式;一种只能表示非负数,而另一种能够表示负数、零和正数。

整型数据类型

根据类型字节分配,不同的大小所能表示的值的范围是不同的。这里给出来的唯一一个与机器相关的取值范围是大小指示符long的。大多数64 位机器使用8个字节表示,比32位机器上使用的 4个字节表示的取值范围大很多。

如下图:

无符号数的编码

假设一个整数数据类型有w位。我们可以将位向量写成 x,表示整个向量,或者写成【x(w-1),x(w-2)…,x(0)】,表示向量中的每一位。把x向量看做一个二进制表示的数,就获得了x的无符号表示。

公式表示

示例图:

值的范围:

让我们来考虑一下w位所能表示的值的范围。最小值是用位向量【00…0】表示,也就是整数值0,而最大值是用位向量【11…1】表示,也就是整数值

无符号数的二进制表示有一个很重要的属性,就是每个介于0-Umax 之间的数都有唯一一个w位的值编码。例如,十进制值11作为无符号数,只有一个4位的表示,即【1011】。这个属性用数学语言来描述就是函数 B2U(w)是一个双射——对于每一个长度为w的位向量,都有一个唯一的值与之对应;反过来,在0~2^w-1之间的每一个整数都有一个唯一的长度为w的位向量二进制表示与之对应。

补码编码

我们希望可以表示负数值。最常见的有符号数的计算机表示方式就是补码(two’s-complement)形式。在这个定义中,将字的最高有效位解释为负权(negative weight)。

1. 公式表示:

最高有效位成为符号位,它的权重位 -2^(w-1), 是无符号表示中权重的负数,符号位设置为1,表示值为负,设置为0,值为非负。

2. 示例图

3. 值的范围

w位补码所能表示的值的范围。

  • 最小值是位向量【10…0】也就是设置这个位为负权, 其他所有位清除,整数值为:

  • 最大值是位向量 [01…1] (清除具有负权的位,而设置其他所有的位), 其整数值为:

4. 小总结

我们可以看出 B2Tw是一个从长度为w的位模式到 TMin、和 TMax.之间数字的映射,写做

同无符号表示一样;在可表示的取值范围内的每个数字都有一个唯一的w位的补码编码。用数学语言来说就是 B2Tw是一个双射——每个长度为w的位向量都对应一个唯一的值;反过来,每个介于-2^(w-1) 和 2 ^(w-1) -1之间的整数都有一个唯一的长度为w的位向量二进制表示。

5. 重要的数字表示

C语言标准并没有要求用补码形式来表示有符号整数,但是几乎所有的机器都是这么做的。程序员如果希望代码具有最大可移植性,能够在所有可能的机器上运行,那么除了图 2-10所示的那些范围之外,我们不应该假设任何可表示的数值范围,也不应该假设有符号数会使用何种特殊的表示方式。另一方面,许多程序的书写都假设用补码来表示有符号数,并且具有图2-8和图2-9所示的"典型的"取值范围,这些程序在大量的机器和编译器上也有可移植性。C库中的文件<limits.h>定义了一组常量,来限定编译器运行的这台机器的不同整型数据类型的取值范围。比如,它定义了常量 INT MAX、INT MIN和UINT MAX,它们描述了有符号和无符号整数的范围。对于一个补码的机器,数据类型 int 有w位,这些常量就对应于TMαx、TMin,和UMax,的值。

6. 确定大小的整数类型(移植性)

ISO C99标准在文件 stdint.h中引入了另一类整数类型。这个文件定义了一组数据类型,它们的声明形如intN t和uintN t,指定的是N位有符号和无符号整数。N的具体值与实现相关,但是大多数编译器允许的值为8、16、32和64。因此,通过将它的类型声明为uint16_t,我们可以无歧义地声明一个16位无符号变量,而如果声明为int32 t,就是一个32位有符号变量。

这些数据类型对应着一组宏,定义了每个N的值对应的最小值和最大值。这些宏名字形如INTN MIN、INTN MAX和 UINTN MAX。

有符号数和无符号数之间的转化

从数学的角度两者转换:

  1. 对于在两种形式中都能表示的值,我们是想要保持不变的。
  2. 另一方面,将负数转换成无符号数可能会得到0。
  3. 如果转换的无符号数太大以至于超出了补码能够表示的范围,可能会得到TMax。

对大多数C语言的实现而言,处理同样学长的有符号数和无符号数之间相互转换的一般规则是;数值可能会改变,但是位模式不变。

值和位模式相同:

利用有相同的位这一事实,可以推导出一些数字关系:

1. 有符号转无符号

2. 无符号转有符号

C语言中的有符号数与无符号数

扩展一个数字的位表示

将一个无符号数转换为一个更大的数据类型,我们只需要简单地在表示的开头添加0,这种运算称为零扩展(zero extension).
将一个补码数字转换为一个更大的数据类型可以执行符号扩展(sign extension),规则是在表示中添加最高有效位的值的副本。

截断数字

关于有符号数与无符号数的建议

有符号到无符号数之间的隐士转换会导致错误或漏洞的发生,避免这一类是正常运算绝不使用无符号数。

使用无符号的场景:当我们想要把字仅仅看做是位的集合,并且没有任何数字意义时,无符号数值是非常有用的。

  1. 往一个字中放入描述各种布尔条件的标记(flag)时,就是这样。
  2. 地址自然地就是无符号的,所以系统程序员发现无符号类型是很有帮助的。
  3. 当实现模运算和多精度运算的数学包时,数字是由字的数组来表示的,无符号值也会非常有用。

3. 整数运算

由于计算机运算的有限性,导致了可能出现正数相加得负数,或者比较表达式 x < y 和 x -y < 0 出现不同的结果。

无符号加法

无符号的运算可以被视为一种模运算形式。 等价于计算和模上 2^w

判定是否溢出:

s = x + y, 当且 s < x 或者 s < y 时发生溢出。

加法逆元:

补码加法


溢出的情况

补码的非

也可以说是负运算: 由 x + -x = 0 推断其表达式

补码非的位级表示

明确一个结论:

计算一个数的补码非的方法

  1. 找到 最右边的1的位置 k
  2. 将位置k坐标的所有位按位取反即可

举个例子: x = 【1100】 = -4 — -》 【0100】= 4

x & -x 也可找到一个补码数字的从右到左第一个 1 。

无符号乘法

补码乘法

乘以常数

在大多数机器上,整数乘法指令相当慢,需要 10个或者更多的时钟周期,然而其他整数运算(例如加法、减法、位级运算和移位)只需要1个时钟周期。因此,编译器使用了一项重要的优化,试着用移位和加法运算的组合来代替乘以常数因子的乘法。首先,我们会考虑乘以2的幂的情况,然后再概括成乘以任意常数。

  • x*14 14= 2^3 + 2^2 + 2^1 重写为 (x << 3) + (x<<2) + (x<<1)
  • x*14 14 = 2^4- 2^1 (x<<4) - (x<<1)
  • 对于 乘数的 位表示 位置n到位位置 m 的连续的 1 (n >= m) 有如下(x << n+1) - (x<<m)

除以2的幂

在大多数机器上,整数除法要比整数乘法更慢——需要 30个或者更多的时钟周期。除以2 的幂也可以用移位运算来实现,只不过我们用的是右移,而不是左移无符号和补码数分别使用逻辑移位和算术移位来达到目的

整数除法总是舍入到零:对于x≥0和y>0,结果是|x/y|,这里对于任何实数a,定义为唯一的整数a’,使得a’≤a’<a‘+1。例如,【3.14】=3,L-3.14】=-4,而【3】=3。

  1. 无符号数除以 2 的k 次幂采取 逻辑右移 k 位即可
  2. 补码正数算术右移即可, 补码负数如果直接算术右移会出现 向下舍入,比如 - 7 >> 2 = -2 , 针对这种处理, C表达式对于补码:

4. 浮点数

在本节,我们将看到在IEEE 浮点格式中是如何表示数字的。我们还将探讨舍入(rounding)的问题,当一个数字不能被准确地表示为这种格式时,就必须向上调整或者向下调整,此时就会出现舍入。然后,我们将探讨加法、乘法和关系运算符的数学属性。许多程序员认为浮点数没意思,往坏了说,深奥难懂。我们将看到,因为IEEE格式是定义在一组小而一致的原则上的,所以它实际上是相当优雅和容易理解的。

二进制小数

十进制的表示法使用的表示形式和二进制表示形式为

  • 数字权和十进制小数点符号 . 有关,每个十进制的di取值范围是 0 ~ 9, 小数点左边的数字 i > 0是 10 的正幂,右边 i < 0 是10的负幂 , 得到小数值。

  • 与十进制表示法类似,二进制的 bi 取值范围是 0~1,表示法如下:

有限表示和近似

假定我们仅考虑有限长度的编码,那么十进制表示法不能准确地表达像 1/3 和 5/7 这样的数。类似地,小数的二进制表示法只能表示那些能够被写成 x×2^y 的数。其他的值只能够被近似地表示。

举例子: 数字 1/5 用十进制小数 0.20 精确表示,但我们不能把其精确地表示为一个二进制小数,只能增加二进制表示的长度近似表示它。

IEEE 浮点表示

定点表示法不能很有效地表示非常大的数字。例如,表达式5 × 2^y是用101后面跟随100个零组成的位模式来表示。相反地,我们希望通过给定x和y的值,来表示形如x × 2^y的数。

单精度浮点格式: s, exp, frac 为 1, 8, 23
双精度浮点数格式:s,exp,frac 为 1,11,52

exp编码值的情况区分:

情况1: 规格化的值

  1. exp 位模式,既不全为0,也不全为1(单精度值为255,双精度为2047)。
  2. 阶码字段被解释为以偏置(biased)形式表示的有符号整数。 阶码的值是 E = e - Bias, e是无符号数,位表示为 ek-1, ek-2,…e0, Bias 是一个等于 2^(k-1) - 1的偏置值。由此得出指数的取值范围是: -126 ~ 127, 双精度是 -1022 ~ 1023。
  3. frace 的解释为 描述小数值f, 其中 0 <= f < 1。 其二进制表示为 0.f(n-1)…f1f0, 可以说二进制的小数点在最高有效位的左边。 尾数定义为 M = 1+ f (隐含的以1开头的表示)。 既然我们总是能调整阶码 E, 使得尾数M在范围 1 <= M < 2 之间,那么这种表示方法就是轻松获取一个额外精度位的技巧。(第一位总是等于1,没有必要显示地表示它。)

情况2: 非规格化的值

  1. 当阶码域全为0, 阶码值为 E = 1-BIAS, 尾数的值是 M = f, 也就是小数字段的值,不包含隐含的开头 1。

非规格化数有两个用途。首先,

  1. 它们提供了一种表示数值0的方法,因为使用规格化数,我们必须总是使M≥ 1,因此我们就不能表示0。实际上,+0.0的浮点表示的位模式为全0,符号位是0,阶码字段全为0(表明是一个非规格化值),而小数域也全为0,这就得到M=f=0。令人奇怪的是,当符号位为1,而其他域全为0时,我们得到值-0.0。根据IEEE的浮点格式,认为值+0.0和-0.0在某些方面是不同的,而在其他方面是相同的。

  2. 表示非常接近 0.0 的数,称为逐渐溢出。

情况3:特殊值

当指阶码全为1的时候出现的。当小数域全为0时,得到的值表示无穷,当s=0时是正无穷,或者当s=1时是负无穷

当我们把两个非常大的数相乘,或者除以零时,无穷能够表示溢出的结果。当小数域为非零时,结果值被称为"NaN",就是"不是一个数"(Not a Number)的缩写。一些运算的结果不能是实数或无穷,就会返回这样的 NaN值。

数字示例


总结一下:


整数值转为浮点数形式

舍入

IEEE浮点数定义的四种不同的舍入方式。

浮点运算

IEEE标准制定了简单的规则:用来确定加法和乘法这样算术运算的结果,计算将产生 Round(x op y),这是一个将计算的精确结果舍入的结果。

IEEE 标准中指定浮点运算行为方法的一个优势在于:它可以独立于任何具体的硬件或者软件实现。因此,我们可以检查它的抽象数学属性,而不必考虑实际上它是如何实现的

  • 浮点加法不具有结合性 : a + b + c 不一定等于 a + (b + c)

  • 浮点加法的单调性:

  • 浮点乘法在加法上不具备分配性

  • 浮点乘法的单调性:

C语言中的浮点数

计算机内功内功修炼:信息的表示与和处理相关推荐

  1. 程序员的外功和内功的修炼

    本文的csdn博客链接:http://blog.csdn.net/screscent/article/details/78427569 本文的qq空间链接://user.qzone.qq.com/29 ...

  2. -9 逆序输出一个整数的各位数字_计算机基础知识: 信息数字化

    计算机.数据与信息 无符号位数的表示 (一).四种常用的数制及它们之间的相互转换: 进制 基数 基数个数 权 进数规律 十进制 0.1.2.3.4.5.6.7.8.9 10 10i 逢十进一 二进制 ...

  3. 多媒体个人计算机能处理什么,多媒体计算机可以处理的信息类型有哪些

    多媒体计算机可以处理的信息类型有文字.数字.图形.图像.音频和视频等.多媒体计算机是指能够对声音.图像.视频等多媒体信息进行综合处理的计算机,一般指多媒体个人计算机. 多媒体计算机处理的信息类型有文字 ...

  4. 以下不属于计算机综合处理多媒体信息的有,国家开放大学《多媒体应用技术基础》第一-二次形成性考核任务试题...

    国家开放大学<多媒体应用技术基础>第一-二次形成性考核任务试题 http://doc.xuehai.net 国家开放大学<多媒体应用技术基础>第一-二次形成性考核任务试题 第一 ...

  5. 计算机毕业设计Javahtml5健身房信息管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Javahtml5健身房信息管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Javahtml5健身房信息管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈 ...

  6. java计算机毕业设计html5健身房信息管理系统源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计html5健身房信息管理系统源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计html5健身房信息管理系统源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  7. 厦门大学计算机科学专业,2018厦门大学计算机科学系考研招生信息汇总

    原标题:2018厦门大学计算机科学系考研招生信息汇总 选择决定命运,成败在于坚持,既然选择了考研,说什么也别放弃,其实成功就是在艰难时刻的最后一次坚持!为了帮助2018年准备考研的备考生们尽快进入复习 ...

  8. java计算机毕业设计学术会议信息网站源码+mysql数据库+lw文档+系统+调试部署

    java计算机毕业设计学术会议信息网站源码+mysql数据库+lw文档+系统+调试部署 java计算机毕业设计学术会议信息网站源码+mysql数据库+lw文档+系统+调试部署 本源码技术栈: 项目架构 ...

  9. 计算机设计大赛作品信息概要表模板

    中国大学生计算机设计大赛 作品信息概要表 (2022版) 作品编号 作品名称 作品大类 作品小类 作品简介(100字以内): 创新描述(100字以内): 特别说明(100字以内,希望评审专家了解的其他 ...

  10. java计算机毕业设计列车票务信息管理系统源程序+mysql+系统+lw文档+远程调试

    java计算机毕业设计列车票务信息管理系统源程序+mysql+系统+lw文档+远程调试 java计算机毕业设计列车票务信息管理系统源程序+mysql+系统+lw文档+远程调试 本源码技术栈: 项目架构 ...

最新文章

  1. Lichee(三) Android4.0该产品的目标文件夹,Lichee链接---extract-bsp
  2. vivado中设置多线程编译
  3. micro850通讯协议msg_micro850通讯协议msg_半导体semi通讯的协议SECS/GEM
  4. wget指定目录下载以及其它的使用方式
  5. cfnet用于嵌入式_做嵌入式驱动的,你一定要挺住!
  6. px是什么意思计算机二级,px是什么意思?照片中的px是什么的缩写?
  7. c实现三角形角度大于一个值_初中数学三角形知识点小结
  8. 设计模式记--Observer Pattern观察者模式
  9. C++ 链表 leetcode习题总结
  10. C#实现WebService服务 项目完整总结
  11. 从html富文本中提取纯文本
  12. [LeetCode]Rotate List
  13. 事业环境因素对项目现场实施的影响
  14. Java学习笔记之设计模式(6)观察者模式
  15. 阿里云服务器搭建 Redis 集群
  16. 甲骨文裁员事件的思考
  17. echarts:x轴文字竖排显示
  18. Swing Copters摇摇欲坠游戏再次风靡全球,再次虐心,摔手机
  19. maven plugins飘红
  20. 网站 xjjdog.cn,敬请惠存

热门文章

  1. Unity打包webgl搭建本地服务器卡loading的解决方案
  2. 芯之联 XR872 快速入门
  3. 无需公网IP,内网穿透实现外网远程桌面办公 3-3
  4. uniapp|showModal不显示
  5. Python数据处理Tips机器学习英文数据集8种算法应用
  6. 基于STM32+Python+MySQL实现在线温度计设计和制作【100010362】
  7. 过渡加载页面时闪烁css,css3 transform过渡抖动问题解决
  8. 当前小程序 跳转 另一个小程序支付(跳转到当前小程序的某个页面)
  9. 算法记录:击鼓传花问题c语言实现
  10. 前端“油画设计师”——双缓存绘制与油画分层机制