负数的二进制表示

部署运行你感兴趣的模型镜像

问题来源:

"为毛   -x=!x+1  ???

其中x为一任意int型正整数,左式表示取x的相反数后的二进制形式,右式表示先将x的二进制按位取反后再加一得到的二进制形式。

左右两个二进制相同"


假设有一个 int 类型的数,值为5,那么,我们知道它在计算机中表示为: 


00000000 00000000 00000000 00000101 


5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 


现在想知道,-5在计算机中如何表示? 


  


在计算机中,负数以原码的补码形式表达。 


什么叫补码呢?这得从原码,反码说起。 


  


原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 


比如 00000000 00000000 00000000 00000101 是 5的 原码。 


          10000000 00000000 00000000 00000101 是 -5的 原码。 


  


反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 


取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) 


比如:正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 


负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。 


称:11111111 11111111 11111111 11111010 是 10000000 00000000 00000000 00000101 的反码。 


反码是相互的,所以也可称: 


10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。 


  


补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1. 


比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。 


那么,补码为: 


11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011 




所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。 




再举一例,我们来看整数-1在计算机中如何表示。 


假设这也是一个int类型,那么: 




1、先取-1的原码:10000000 00000000 00000000 00000001 


2、得反码:     11111111 11111111 11111111 11111110(除符号位按位取反) 


3、得补码:     11111111 11111111 11111111 11111111 




可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF 






主要知识点: 


正数的反码和补码都与原码相同。 
而负数的反码为对该数的原码除符号位外各位取反。 
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1 


下面是书上原文: 


原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。 
反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。 
补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
正零和负零的补码相同,[+0]补=[-0]补=0000 0000B




您可能感兴趣的与本文相关的镜像

Dify

Dify

AI应用
Agent编排

Dify 是一款开源的大语言模型(LLM)应用开发平台,它结合了 后端即服务(Backend as a Service) 和LLMOps 的理念,让开发者能快速、高效地构建和部署生产级的生成式AI应用。 它提供了包含模型兼容支持、Prompt 编排界面、RAG 引擎、Agent 框架、工作流编排等核心技术栈,并且提供了易用的界面和API,让技术和非技术人员都能参与到AI应用的开发过程中

### 负数二进制表示方法及补码原理 在计算机科学中,负数通常通过 **补码** 的形式来表示。以下是详细的说明: #### 1. 原码、反码和补码的概念 - **原码 (Sign-Magnitude Representation)** 是最简单的表示方式,其中最高位作为符号位(0 表示正数,1 表示负数),其余位表示数值本身的绝对值[^2]。 - **反码 (One's Complement)** 是通过对原码中的每一位取反获得的(除了符号位外)。对于正数,其反码与原码相同;而对于负数,则需要将其数值部分逐位取反。 - **补码 (Two's Complement)** 是基于反码进一步计算得出的结果,在反码的基础上加 1 即可得到补码。这是目前大多数现代计算机用来存储整数的方式,因为它可以简化算术运算并避免零的双重表示问题[^3]。 #### 2. 如何获取一个负数的补码? 假设有一个十进制负数 `-X` (其中 `X` 是它的正值版本): 1. 首先写出 X 的二进制形式; 2. 对该二进制形式按位取反(即形成反码); 3. 将所得结果加上 1 得到最终的补码形式。 例如,如果我们要找 -5 的补码(假定我们工作在一个字节长度下,也就是 8 bits 下面的情况): - 正数 5 的二进制为 `00000101`; - 它的反码会变成 `11111010` (将所有的 0 和 1 进行交换); - 加上 1 后变为 `11111011`. 因此,-5 在这种情况下被表示成 `11111011` [^1]. #### 3. 计算机内部如何处理这些数据? 当涉及到实际硬件层面的操作时,CPU 并不会区分某个特定比特串到底是代表什么含义——无论是地址还是指令或者仅仅是普通的数值。然而软件开发者以及编译器知道哪些变量应该解释为什么样的类型,并据此执行相应的操作逻辑。正因为如此,即使同一个物理内存单元可能既保存过字符串也可能后来又转而储存浮点数,只要上下文中保持一致即可正常运作[^4]. ```python def decimal_to_twos_complement(n, num_bits=8): """Convert an integer to its two's complement binary form.""" if n >= 0: return bin(n)[2:].zfill(num_bits) else: mask = (1 << num_bits) - 1 return bin((n & mask))[2:] print(decimal_to_twos_complement(-5)) # Output: '11111011' ```
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值