原码、反码、补码和Int整数的表示法

文章详细介绍了计算机中整数的表示方式,包括原码、反码和补码的概念。对于正数,原码、反码和补码相同,而负数则遵循特定的转换规则。补码的设计使得二进制运算更加高效,尤其是在加法运算中,如5+(-5)=0,在补码系统下能得到正确结果0。

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

在这里插入图片描述

整数表示法

int整数的表示分成了两个部分

符号位 - 数值位
1000 0000 0000 0001

整数的第一位如果是1,那么这个整数就是负数,如果是0,则是正数
后面的所有位,存储的都是该数的补码

原码

将一个整数转换成二进制形式,就是其原码。例如short a = 6;
a 的原码就是

0000 0000 0000 0110

更改 a 的值a = -18;
此时 a 的原码就是,注意第一位是符号位

1000 0000 0001 0010

通俗的理解**,原码就是一个整数本来的二进制形式**。

反码

对于正数,它的反码就是其原码(原码和反码相同)
负数的反码是将原码中除符号位以外的所有位取反
例如short a = 6;
a 的原码和反码都是

0000 0000 0000 0110

更改 a 的值a = -18;
此时 a 的反码是

1111 1111 1110 1101

补码

对于正数,它的补码就是其原码(原码、反码、补码都相同);
负数的补码是其反码加 1。
例如short a = 6;
a 的原码、反码、补码都是

0000 0000 0000 0110

更改 a 的值a = -18,此时 a 的补码是

1111 1111 1110 1110

可以认为,补码是在反码的基础上打了一个补丁,进行了一下修正,所以叫“补码”。
总结:正数的原码、反码、补码完全一样,只有负数需要按照以上规则计算。

为什么用补码进行运算

5 + (-5) = 0
那么…5的某种码加(-5)的某种码,会不会恰好是0的某种码呢?
如果真的是,计算机中有上亿次计算,计算效率会大大提高,过程会极大的简化。

原码和的十进制结果是 -10,结果是错的,因为符号位没法直接相加

反码和是 11111111,对应十进制 -0 ,大家觉得-0还是0?
这样我们就有两种0,虽然不对,结果已经非常接近了!!
但是…每个二进制和十进制都是数的表示形式,是一一对应的。
01111111是不是也可以表示0,两种形式都表示0,那么是不是某个数不能被表示了

补码和000000000,刚好是0,补码在加法器运算上具有独到的优势,不得不慨叹这个设计的精妙绝伦.

### 小数在计算机中的编码方式 对于整数而言,原码反码以及补码的概念较为清晰。然而当涉及到小数时,情况变得复杂一些。 #### 整数部分与小数部分的处理差异 针对带有小数点的实数,在计算机内部通常不会直接采用类似于整数那样的简单形式来表达其正负号绝对值之间的关系。相反,会利用特定的标准如IEEE 754浮点标准来进行更为复杂的编码[^1]。 #### 浮点数表示法概述 按照IEEE 754规定,一个典型的单精度(32位)或双精度(64位)浮点数由三部分构成:符号位S(Sign)、指数E(Exponent)及尾数M(Mantissa)。其中: - 符号位用于指示该数值是正是负; - 指数用来调整有效数字的位置从而实现大范围内的近似计算; - 尾数则保存实际的有效信息即所谓的“分数”。 这种结构允许机器能够高效而精确地处理各种大小不同的实数运算需求。 #### 特殊情况下对小数应用定点数概念 尽管如此,在某些特殊应用场景下也会遇到所谓“定点数”的定义——即将某个固定位置设为隐含的小数点所在处。此时如果要讨论类似原码/反码/补码这样的术语,则仅限于描述这个假想出来的纯整型序列而已;真正意义上的小数还是得依靠前述提到过的正规化后的科学计数法去诠释[^2]。 ```cpp // C++ 示例展示如何打印float类型的内存布局 #include <iostream> union FloatBits { float value; struct { unsigned int mantissa : 23; // 尾数部分 unsigned int exponent : 8; // 指数偏置后的真实值 unsigned int sign : 1 ; // 正负标志 } parts; FloatBits(float v) : value(v){} }; int main(){ FloatBits fb(0.1f); std::cout << "sign:" << fb.parts.sign << ", exp:" << static_cast<int>(fb.parts.exponent)-127 << ", frac:"<< fb.parts.mantissa<<'\n'; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YUE ZHEN PENG

码字不易,如果你想请我喝杯果汁

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值