定点数表示方法——原码,补码,反码,移码

本文介绍了定点数在计算机中的四种表示方法:原码、补码、反码和移码。原码直接表示数的符号,但存在0的两种编码和减法运算复杂的问题。补码通过取反加1解决这些问题,适用于加减运算,特别是将减法转换为加法。反码与原码类似,但负数求反后再加1,而移码主要用于浮点数的阶码,具有直观的大小比较特性。

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

1. 真值和机器数

    真值:数的实际值,用正负号和绝对值的某进制形式来表示,如+1010,-12,-FFFF等.

    机器数:真值在计算机中的二进制表示,特点是符号数字化且数的大小受机器字长限制,其表示形式有原码,补码,反码,移码等.

2. 原码.

    1). 定点小数:

\[{x_{[{\rm{原}}]}} = \left\{ {\begin{array}{*{20}{l}}
{x,0 \le x < 1}\\
{ {2^0} - x = {2^0} + \left| x \right|, - 1 < x \le 0}
\end{array}} \right.\]

    (其中x[原]是机器数,x是真值,最高位为符号位,下同.)

    表示范围:

\[\max = 1 - {2^{ - n}},\min = - (1 - {2^{ - n}})\]

    (n是指x除符号位的位数,下同)

    如: x=+0.1011, x[原]=0.1011

    x=-0.1011, x[原]=1.1011

    2). 定点整数:

\[{x_{[原]}} = \left\{ \begin{array}{l}
x,0 \le x < {2^{\rm{n}}}\\
{2^n} - x = {2^n} + |x|, - {2^n} < x \le 0
\end{array} \right.\]

    表示范围:

\[\max  = {2^n} - 1,\min  =  - ({2^n} - 1)\]

    如:x=+10

### 定点小数 -1 的编码方式 对于定点小数 `-1`,可以按照不同的编码方式进行表示: #### 原码表示 原码是最直观的一种机器表示形式。对于整数部分为 `0` 的纯小数而言,其符号位用于表示正负(`0` 表示,`1` 表示),而值部分则直接采用二进制绝对值的形式。 因此,假设使用 8 表示,则有: - 符号位:`1` (因为是负) - 值部分:`0.1111111` 最终得到的原码为 `1.1111111` 者在计算机存储中通常去掉小数点写作 `11111111`[^1]。 #### 反码表示 根据定义,正反码与其原码相同;而对于负来说,除了保持最左边一作为符号标志外,其他各求反即可获得该对应的反码表达式。 于是针对上述例子中的 `-1` ,它的反码就是将除首之外的所有由 `1` 转换成 `0` 得到的结果,即 `10000000`。 #### 补码表示 补码是为了简化加减运算所引入的概念之一。当处理的是带符号的小数时,如果已知某 x 的真值以及它所在的据类型所能容纳的最大宽 n (比如这里是 8),那么可以通过下面的方式计算出相应的补码 y :\[y=(2^n+x)\%2^n\] 具体到本题当中,由于我们讨论的对象是一个八字节内的最小可能正值 (-1), 所以其补码等于 \(2^8+(-1)=256-1=255\) , 即十进制下的全 '1' 序列,在二进制下表现为 `11111111`. 值得注意的是这正好与前面提到过的原码一致,这是因为在这个特殊情况下,所有的都被置为了高电平状态. #### 移码表示 移码主要用于浮点规格化过程中阶码字段的表现上。一般来讲,会先获取给定据对象基于某种规则形成的无符号版本 z (例如这里的补码),再通过加上某个固定的偏移量 k 来完成转换过程。\[(z+k)%2^n\] 考虑到题目仅涉及到了定点小数而非指型变量,故此处在描述时不作过多展开。不过简单起见可以选择令k等于\(2^{n-1}\)(其中n代表总宽度)从而使得任何实际存在的有效输入都能映射成非负区间内唯一确定的置关系。这样做的好处是可以让原本处于不同半区间的两个操作经过变换后都落在同一个范围内便于比较大小者执行逻辑判断等任务。 对于 `-1` 这个特定情况,若同样采取 8 长度并设定偏移常量 K = 128,则可得 `(255 + 128) % 256 = 127`, 对应于二进制串 `01111111`[^3]. ```python def get_representation(value, bits=8): if value >= 0: sign_bit = "0" abs_value = bin(int(abs(value)))[2:].rjust(bits - 1, '0') else: sign_bit = "1" abs_value = bin(int(abs(value)))[2:].rjust(bits - 1, '0') original_code = f"{sign_bit}{abs_value}" # For negative numbers only. inverted_bits = ''.join(['1' if bit == '0' else '0' for bit in abs_value]) if value < 0 else abs_value complemented_number = int(inverted_bits or "0", 2) + 1 complemented_binary = bin(complemented_number & ((1 << (bits - 1)) - 1))[2:].rjust(bits - 1, '0') one_complement = f"{sign_bit}{inverted_bits}"[:bits] two_complement = f"{sign_bit}{complemented_binary}" bias = 2 ** (bits - 1) biased_value = (int(two_complement, base=2) + bias) % (2 ** bits) return { "original": original_code, "one's complement": one_complement, "two's complement": two_complement, "biased": format(biased_value, f'0{bits}b'), } result = get_representation(-1) print(f"Original Code: {result['original']}") print(f"One's Complement: {result['one\'s complement']}") print(f"Two's Complement: {result['two\'s complement']}") print(f"Biased Representation: {result['biased']}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值