xiaosawanjava 发表于 2014-5-25 00:07:45

【总结】负数的存放,以及cpu怎样看待无符号和有符号的运算

      1.负数的存放      计算机存放负数是以补码的形式存放的


      我们要知道补码是怎么来的,就要先了解源码和反码

      一个数的源码就是这个数的二进制形式    例如   5   的源码就是 0000 0101

      而反码就是 对 源码 按位取反               例如   5   的反码就是 1111 1010

      补码就是在反码的基础上加1得来的      例如-5   的反码就是 1111 1011




      由此结论知道一个负数的补码,想求这个数是多少就是: 补码 先减去 1 ,在进行按位取反,就得到这个数了。


      其实我也是刚刚才知道的,以前拿补码是这样算的:补码取反之后的结果再加1 ,但是我这样的算结果偏偏是对的

   但是这样使得我对负数转成补码老是有疑惑,这是说出来是想提醒一下如果也有和我一样这样计算补码的朋友,请

   快点更正过来,不能这样去划算。




   2.有符号和无符号的运算
    其实我刚开始也非常困惑的,不知道两个数相加计算机到底是以无符号的形式计算,还是以有符号的形式进行计算
   
   现在我终于也算是搞清楚了,也是糊里糊涂的就一下子就明了了,下面我就将我对有符号和无符号的理解分享出来


    这里要注意一点的就是   85H 这个数据,现在只是16进制形式表示的,它既能表示十进制的+138 或 -123,搞清楚


   这里就好办了,我主要是围绕 当85H 为负数-123 和 正数 +133 ,计算的结果是多少,而 5H 他只能表示正数


   我现在就举一个例子,比如:85H + 5H =8AH,现在我们就是cpu,记住cpu是不知道 数据是有符号还是无符号
   
   我们先分析这两个数的 二进制形式是多少 ,转换之后是:1000 0101 + 0000 0101 = 1000 1010,转换的目的


   是为了让大家看明白如果这2个数是有符号,计算的结果会不会出错。 现在我是程序员,我要进行的是无符号数


   运算,因为无符号数据,不需要考虑符号,所以 1000 0101 = 135,0000 0101 = 5 , 1000 1010 = 138
   
   刚好 135 加上 5 是等于 138 。好无符号计算先说到这里,等分析完了有符号计算在来比较一下就清楚明了了


   现在我觉得吧这个数据当成有符号数了,因为是有符号计算要考虑到符号位,这里提醒一下,如果是8位运算那就看


   第8位,16位计算就看第 16 位,这里   1000 0101 这个数据,第8位是 1 那就说明这个数是负数的补码形式存放的


   负数的存放的相信大家还记得吧。所以 1000 0101 = -123,而 0000 0101 最高位是0表示正数,正数是以源码


   存放的所以 0000 0101 = 5,而结果 1000 1010最高位是1 表示负数,将补码 1000 1010 转换之后就变成了 -118


   而 -123 加上 5刚好等于 -118。 我相信我讲到这里,大家应该很容易就看出来了为什么说 无符号 和有 符号是根据


   我们程序员来的,我们认为他是无符号他就是无符号,认为有符号就是有符号。




    对于无符号和有符号的表示形式,如果还是有不理解的可以看下下面我拷贝的小知识


    虽然一直用C/C++,但很少涉及到Bit序列的问题。比如,-1的二进制表示到底是怎样的?
    从没有深究过,一直都是模棱两可的,说出来实在让人笑话。


    对于有符号整型数的简单认识就是,最高位为符号位,0为正,1为负,那么剩下几位应该如何表示呢?
    理所当然的认为,既然是1表示为0000 0001(假设为8位整型数,下同),那么-1就应该表示为1000 0001了。


    但是,在C语言里,-1的正确表示应该是1111 1111,即0xFF。因为C语言里,对整型数是
    采用Two’s complement表示法,而前面我的理解则是Sign-Magnitude表示法(浮点数采用该法)。
    在Two’s complement表示法里,1000 0001表示的是-127。


    几个特殊值,比如:正值的最大表示为0111 1111,即127。负值的最小表示为1000 0000,即-128。

   

   

kikiatw 发表于 2014-5-25 06:44:07

假設一個數為 X, 則有另外一個數 Y與 X 相加後(bit)每個 bit 為 0 且溢位, 則 Y 就是 X 的負數

秋之帆 发表于 2014-5-25 09:46:12

谢谢分享!

fayisan 发表于 2014-5-25 14:39:54

支持!多多总结多多益善{:5_98:}

低手莫怪 发表于 2017-3-5 19:49:27

谢谢楼主,看了之后明白很多

页: [1]
查看完整版本: 【总结】负数的存放,以及cpu怎样看待无符号和有符号的运算