博客列表 >二进制中的若干问题

二进制中的若干问题

so的博客
so的博客原创
2017年12月09日 13:35:201082浏览

1. 给定n位有符号二进制数,则它能表达的数值范围为 -2^(n-1) ~ (2^(n-1))-1, 为什么负整数比正整数多一个呢?

    比如8位,最高位为符号位,所以:

            正数表示的范围为 0~(2^7-1) => 0~127,  0表示为 0000000 

            负数也可以从 10000000 ~ 11111111 ,此时出现了-0,而-0没有任何价值,就将-0看成-2^(7-1), 即-0=> -128


2. 原码: 正数-》本身,符号位为0   负数-》本身,符号位为1

    反码: 正数-》本身, 负数-》符号位不变,数据位各位取反

    补码:正数-》本身, 负数-》符号位不变,数据位各位取反,再加1

  补码求法: 从右边复制位,直到有1被复制,然后,反转其余的位。

     


3. 为什么要使用补码?

    计算机对符号位的识别很困难,于是让符号位也参加运算,一个正数减去一个数相当于加上一个负数,即 1-1 = 1+ (-1)=0, 所以机器只有加法没有减法。

    a. 使用原码

    1-1 = 1+(-1) = [00000001]原  + [10000001]原 = 无法确定符号位

    b. 使用反码

    1-1 = 1+(-1) =[00000001]反  + [11111110]反  = [11111111]反 = [10000000]原  = -0

    对于0而言,存在+0和-0,而0带符号没有任何意义,而且会有[00000000]原 与[10000000]原两个表示

    c. 使用补码

    1-1 = 1+(-1) = [00000001]补 + [11111111]补  = [00000000]补 = [00000000]原 = 0  

    这样 -0就不存在了,可以用 [10000000]表示-128

    -1 + (-127) = [11111111]补 + [10000001]补  = [10000000]补  = -128, 注意-128不存在原码和反码表示。


4.  补码正确性的数学原理

同余数理论,好比时钟:

 

回拨2小时 = 前拨10小时

   

回拨4小时 = 前拨8小时

   

回拨5小时= 前拨7小时

                                 

5. 浮点数转换成2进制

0.4 =》0.01110001 无穷

    


 


上一条:csrf原理下一条:JAVA HashMap
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议