C++ 小知识

举报
Linux猿 发表于 2021/08/05 00:35:31 2021/08/05
【摘要】 一、补码的补码是原码的解释。         假设一个负数 x 用 8 二进制 位表示,则补码 =  2^8 - | x |  ,那么再求补码 = 2^8 - ( 2^8 - | x | ) = 此数的原码  二、int  取值范围 - 2^15 ~ 2^15 - 1 的解释   ...

一、补码的补码是原码的解释。

        假设一个负数 x 用 8 二进制 位表示,则补码 =  2^8 - | x |  ,那么再求补码 = 2^8 - ( 2^8 - | x | ) = 此数的原码 

二、int  取值范围 - 2^15 ~ 2^15 - 1 的解释

       因为数再计算机里存储是以二进制的补码形式存储的,正数的二进制还是正数所以范围是 0000 0000 0000 0000 ~ 0111 1111 1111 1111 (0 ~ 2^15-1),负数范围为

 1000 0000 0000 0000 ~ 1111 1111 1111 1111 (是以补码方式存储的,将其取出符号位然后取反加 1 就得到了其原码 )  - 2^15 ~ -1 。

三、关于计算机采用补码存储的原因(转)

总所周知,计算机内部的所有数都是以二进制的形式存在的。而二进制在计算机里又有多种编码方式——原码、反码、补码等。而在这些编码方式里面用得最多的不是最简单、最直接的原码而是补码。这是为什么呢?想搞懂这个问题首先得明白什么是原码、反码以及补码,如果你对他们还不太了解,那就先看看我另一篇博客——原码、反码、补码其实很简单。如果你对他们已经很熟悉,那么我们继续往下看。
A、B、C三种相似的东西,选C而不选A和B,那么C肯定具有其他两者所没有的优势。那么补码究竟有什么优势让他备受青睐呢?下面我们具体的分析一下:
原码:
原码的特点就是编码简单直观,与真值转换非常方便。既然原码这么好,那为什么不选他而选补码呢?接下来就是不选他的关键所在,虽然原码非常的简单直观,但是当用原码表示0的时候就会出问题。0用原码表示分为+0和-0,当机器字长为8时,
[+0]原=00000000,[-0]原=10000000。
这就有问题了,同一个数却有两种表示,产生了二义性,从而给机器判断0带来了麻烦;二是用原码运算时,符号位需要单独处理,而且运算规则很复杂。例如加法运算,若两个数异号,则先要让绝对值大的数减去绝对值小的数,然后把绝对值大的数的符号付给结果。还有就是,借位操作如果用计算机硬件实现起来是很困难的。正是因为原码有这些不足之处,才促使人们研究其他的编码方法。
反码:
反码很少会被用到,他主要的用途就是作为原码与补码的一个桥梁。他和原码一样对0有两种表示方法,
[+0]反=00000000,[-0]反=11111111。
不采用反码的原因跟原码差不多,就不赘述了。
补码:
说到补码,就不得不引人另一个概念——模数。模数从屋里意义上讲是某种计量器的容量。这里我们经常举的一个例子就是钟表,其模数为12,即每到12就重新从0开始,数学上叫取模或求余(mod),java、C#和C++里用%表示求余操作。例如:
14%12=2
如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即
8-2=6
(8+10)%12=6
也就是说在此模数系统里面有
8-2=8+10
这是因为2跟10对模数12互为补数。因此有一下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即
8-2/8+(-2)=8+10
我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。
采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符


文章来源: blog.csdn.net,作者:Linux猿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nyist_zxp/article/details/43112833

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。