鱼C论坛

 找回密码
 立即注册
查看: 2867|回复: 4

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

[复制链接]
发表于 2014-5-25 00:07:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
      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。
  
     

   

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
freeparty + 2 + 2 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-25 06:44:07 | 显示全部楼层
假設一個數為 X, 則有另外一個數 Y  與 X 相加後(bit)每個 bit 為 0 且溢位, 則 Y 就是 X 的負數
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-25 09:46:12 | 显示全部楼层
谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-5-25 14:39:54 | 显示全部楼层
支持!多多总结多多益善
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-5 19:49:27 | 显示全部楼层
谢谢楼主,看了之后明白很多

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 12:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表