理解原码、反码和补码-------带例子详解

本文介绍了正数和负数在计算机中如何转换成二进制的原码、反码和补码形式,并通过具体例子展示了这些转换的过程。同时,文章还解释了左移和右移操作对数值的影响。

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

**对于正数原码和补码是一样的;
对于负数,先对其数字部分(-9的数字部分就是9)原码取反,形成反码,然后再加一,形成补码;
最高一位:0正1负**

例子:
(1)~9(求对9按位取反的结果)
解析:
9:0000000000000000 1001(源码补码相同)
结果:1111111111111111111111 0110存的是???

负数是肯定的
设为X;
能确定的是,这个负数按位取反后加一后就是11111111111111111 0110
所以这个数是10000000000000 1010
(这时按位取反是不能动符号位的,而9取反是可以动的,因为就是在每一位取反;)
所以是-10

(2)1<<31>>31(求1左移31位,再右移31位的结果)
———>结果是-1
其中1<<31结果是-2147483648,此时就是最小负数:二进制码是:1000000000000000000000000
此时已经改变了数字的正负性质:此时再右移最高位仍然是1,其余位补0,所以最后结果是10000000000000000000001—>就是-1;

注意:
1 << 31 = > -2147483648,最小负数. -(-2147483648) = 2147483647 + 1 => 最大正数 + 1 = 最小负数 = -2147483648

### 正负数的原码反码补码详解 #### 定义与转换规则 在计算机科学中,整数通常以二进制的形式存储。为了处理正数负数,引入了三种编码方式:**原码**、**反码****补码**。 1. **原码** 原码是最简单的表示方法,最高位作为符号位(0表示正数,1表示负数),其余位表示数值绝对值的二进制形式[^1]。 2. **反码** 对于正数,其反码与其原码相同;对于负数,将其原码的数值部分按位取反(即0变1,1变0)。注意,符号位保持不变。 3. **补码** 对于正数,其补码与其原码相同;对于负数,在其反码的基础上加1得到补码[^1]。 --- #### 2 -2 的具体分析 ##### (1)正数 2 的原码反码补码 十进制数 `2` 转换为8位二进制: - **原码**: 符号位为0(正数),数值部分为 `00000010`,因此原码为 `00000010`。 - **反码**: 正数的反码等于其原码,所以反码也为 `00000010`。 - **补码**: 正数的补码也等于其原码,故补码仍为 `00000010`。 ##### (2)负数 -2 的原码反码补码 十进制数 `-2` 转换为8位二进制: - **原码**: 符号位为1(负数),数值部分为 `00000010`,因此原码为 `10000010`。 - **反码**: 将原码的数值部分逐位取反,得到 `11111101`。 - **补码**: 在反码基础上加1,计算如下: ```plaintext 反码: 11111101 加1: + 1 ------------------- 补码: 11111110 ``` 所以,-2 的补码为 `11111110`。 --- #### 数据类型的扩展与提升 当较小的数据类型被赋值给较大的数据类型时,会发生数据提升操作。此时,会按照补码的方式进行扩展。例如: ```c #include <stdio.h> int main() { char a = 2; short b = a; int c = a; printf("char a=%d, binary=%08b\n", a, *(unsigned char*)&a); // 输出二进制形式 printf("short b=%d, binary=%016b\n", b, *(unsigned short*)&b); printf("int c=%d, binary=%032b\n", c, *(unsigned int*)&c); return 0; } ``` 运行结果表明,无论是正数还是负数,都会通过补码方式进行高位填充[^3]。 --- #### 总结表 | 数值 | 原码 (8位) | 反码 (8位) | 补码 (8位) | |------|------------|------------|------------| | 2 | 00000010 | 00000010 | 00000010 | | -2 | 10000010 | 11111101 | 11111110 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值