计算机科学(二)

一、补码
    在我们的二进制运算当中,负数都是以补码的形式存在的,这句话很关键,为什么呢?可以看下面的例子:
  以1,-1为例
  1、两个正数相加
     0001 + 0001 = 0010 (正确)
     
  2、一正一负相加(可以理解为相减)
     0001 + 1001 = 1010(-2)
     //结果显然不对
     
  3、一正和一负的反码
     0001 + 1110 = 1111(取反-0不存在,相当于-16)
     // 但是符号不对

  4、正补和负补(正数的补码就是本身)
     0001 + 1111 = (1符号位)0000 (0结果正确)
     // 如果得出的结果为负数则逆回去(-1,符号不变取反,符号位始终为最高位,溢出位不算)为真实值, 正数则不需要,因为正数的补码就是本身。
     我们再举几个例子:
     0100 + 1110(原码:1010) = 0010 (2)
     // 正确
     0001 + 1110(原码:1010) = 1111 (减1,符号不变取反:1001 = -1)
     // 正确
   这里我们再理解一个概念: 为什么8位数不能表示正128?
   我们假设在8位数中存在正128,那么是不是应该表示为1000 0000呢?
   但此时系统会将它识别为负数的补码形式,于是将其还原(减一,符号不变取反:1000 0000    - 1 = 1111 1111 取反为 1000 0000 系统并将此形式默认为-128),所以对于一个有符号的char类型来说取值范围就是 -128~-1,0~127.

二、逻辑右移(>>)和算术右移(>>)(左移时没有区别)
    逻辑右移: (移动符号位)
    算术右移: (不移动符号位)

    例:1、0111 1000 (正数时也没区别)
        逻辑右移2位: 0001 1110
        算术右移2位: 0001 1110
     
        2、1001 1000 (利用补码的原理)
        逻辑右移2位: 0010 0110
        算术右移2位: 1110 0110
        (原理:1001 1000(补码) - 1 = 1001 0111(反码) = 1110 1000(原码)
         然后:1110 1000 >> 2 = 1001 1010(原码) = 1110 0101(反码)+ 1 = 1110 0110(补码))

        总结:当我们在进行左右移的时候最好注明是否为unsigned类型;

三、float的二进制结构:
    float 采用IEEE的编码:
    例如:1011 0011
    1(第一位后加小数点) 0110011(放在23位里,不足位数补零)
    这里也不多说了,看了一篇博客写的挺不错的,有兴趣的可以去借鉴下:

    http://blog.csdn.net/zcczcw/article/details/7362473

(未完待续)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值