补充知识--负数的二进制

假设有一个 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

### Java 中的二进制表示及相关操作 #### 一、基本数据类型的二进制转换 在 Java 中,可以通过内置方法实现不同数据类型到其对应的二进制字符串形式的转换。例如: - 对于 `long` 类型的数据,可以使用 `Long.toBinaryString(long i)` 方法将其转为二进制字符串[^1]。 - 对于 `int` 类型的数据,可以利用 `Integer.toBinaryString(int i)` 将其转化为二进制字符串[^2]。 以下是具体的代码示例: ```java public class BinaryExample { public static void main(String[] args) { long b = 42L; String binaryString = Long.toBinaryString(b); System.out.println("The binary representation of " + b + " is: " + binaryString); int i = 65; System.out.println("i= " + i + " = " + Integer.toBinaryString(i) + "(B)"); } } ``` #### 二、负数二进制表示 Java 中采用 **补码** 来表示负数。具体而言,对于 `byte` 类型来说,当数值小于零时,最高位被设置为符号位 (即第8位),其余部分则按照补码规则填充。例如 `-128` 的二进制表示为 `10000000`,其中第一位代表符号位,剩余七位均为零[^3]。 #### 三、布尔值的存储方式及其二进制表现 尽管逻辑上的布尔变量只需占用单个比特来区分真伪状态 (`true` 或者 `false`) ,但在实际内存分配过程中,由于硬件架构的原因,JVM 至少会为其分配一个完整的字节作为存储空间。这意味着即使只存在单一有效位用于标志真假情况,在物理层面仍需额外补充七个无意义的零至该单元内完成对齐处理[^4]。 #### 四、按位运算符的应用场景之一——屏蔽高位 通过与特定掩码执行 AND(&) 运算能够有效地清除目标整数中的某些指定范围内的高阶位而保留低阶位不变。比如当我们希望确保某个字符变量 c 不会发生符号扩展现象,则可以在它参与进一步计算之前先做如下预处理:`(c & 0xFFFF)` 。此表达式的含义在于强制把原始 char 值视作 unsigned short 处理,并且显式告知编译器无需考虑可能存在的符号传播问题[^5]。 ```java char c = 'A'; // Ensure no sign extension occurs when promoting to an integer type. int result = c & 0xFFFF; System.out.printf("Character '%c' as unsigned value: %d%n", c, result); ``` #### 结论 综上所述,掌握这些基础知识点有助于开发者更好地理解程序内部运作机制以及优化性能瓶颈所在之处。无论是简单的数值显示还是复杂的算法设计阶段,熟悉各种数据结构背后隐藏着怎样的底层细节都是非常重要的技能。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值