二进制之补码与小数

本文介绍了二进制如何表示负数、小数以及进行乘法和除法运算。补码用于表示负数,通过取反加一得到;乘法和除法通过移位操作实现;符号扩充在保持数值不变的情况下扩大位数;二进制小数转换为十进制可能存在不连续性,浮点数存储采用正则表达式和“EXCESS”系统表示小数和指数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

牛逼的二进制

1.前言

计算机使用二进制来表示所有形式的数据:颜色、文字、图像等。当前辈们想方设法要造一台计算机时都会遇到一个问题:怎么用电来表示数? 显然他们发现开关的开和关正好对应二进制的0和1,然后计算机就使用二进制直到如今。

那计算机怎么使用二进制表示负数呢?怎么表示小数?怎么进行运算呢?

2.用二进制表示负数

由于二进制不能表示负数,所以必须使用正数来表示负数,将最高位当符号位使用,0正1负,这样就可以使用加法来进行减法运算。

而补数就是用正数表示负数,一个正数的补数就是它的负数,所以二进制数与它的补数相加结果必为0。

获得补数的方法是将二进制数取反加一。

注意:运算结果是负数时,也是用补码来表示。将其返回到源码再在前面加负号就是运算结果。

3.用二进制进行乘法和除法

二进制进行乘除是使用移位运算,将二进制数总体进行左移或右移。

  • 左移:移动后空出来的最低位补0:
    在这里插入图片描述

  • 右移分为逻辑右移和算数右移,逻辑右移移动后空出来的最高位补0,例如霓虹灯;算术右移移动后空来的最高位补移位之前符号位的值。

### 二进制小数补码的表示范围 在计算机科学中,对于二进制小数补码的理解主要集中在如何通过有限数量的比特位有效地表示符号的小数值。当涉及到定点小数时,补码不仅能够处理整数还能扩展到支持小数点后的精度。 #### 定义基本概念 为了理解二进制小数补码的表示范围,首先要明确几个关键术语: - **机器字长**:指的是处理器一次能处理的数据宽度,单位为比特(bit),常见的有8-bit、16-bit等。 - **符号位**:最左边的一位用来指示该数是正是负,0代表正值而1代表负值。 - **尾数(Mantissa/Fractional part)**:除了符号位之外的部分,在这里既包含了整数部分也包括了小数部分的信息[^4]。 #### 补码系统的特性 采用补码形式的主要优势在于简化了硬件设计并允许统一处理加法运算而不必区分操作数的正负性质。具体来说,n位二进制补码可以表示从 \(-2^{(n-1)}\) 到 \(2^{(n-1)} - 1\) 的连续整数值区间[^3]。 然而,当讨论的是小数点的位置固定的定点数时,则需进一步划分这n个bit来分别分配给整数域和分数域。假设有一个m+n长度的寄存器其中前m bits用于存储整数部分而后n bits负责保存小数部分的话,那么整个数的最大绝对值将会受到这两个参数的影响。 #### 小数补码的具体表现 考虑到上述提到的结构特点,如果我们将一个典型的16 bit寄存器分为两部分——比如前面7bits作为整数区域后面9bits作为小数区域——此时所能达到的最大正数将是接近于\(+(2^7)-\epsilon\) (\(\epsilon\)是一个非常微小的数量级取决于具体的实现细节),最小负数则是大约等于-\((2^7)\)。 因此,针对任意指定大小的二进制字符串而言,其对应的十进制实际意义会依赖于事先约定好的小数点位置以及所使用的编码方案(如原码、反码还是补码)。特别是对于那些希望利用补码机制来表达既有整又有分量的情况,必须清楚定义好这些规则才能确保正确解析数据含义。 ```c // C语言示例展示了一个简单的函数转换16位二进制串至相应的十进制浮点数 float binaryToDecimal(const char *binaryString){ int integerPart = 0; float fractionalPart = 0.0f; // 解析整数部分 for(int i=0; i<7 && binaryString[i]!='.'; ++i){ integerPart <<= 1; if(binaryString[i]=='1') integerPart |= 1; } // 跳过可能存在的'.'字符 size_t dotIndex = strcspn(binaryString,"."); // 解析小数部分 for(size_t j=dotIndex+1;j<strlen(binaryString);++j){ fractionalPart /= 2; if(binaryString[j]=='1') fractionalPart += 0.5; } return (integerPart + fractionalPart); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值