美文网首页
-128补码10000000

-128补码10000000

作者: wenjieli | 来源:发表于2017-11-28 15:39 被阅读0次

    最近在学Swift, 在学到高级运算符的时候, 用到了位运算, 然后发现自己把计算机基础的进制忘的差不多了. 在这里记录学习一下

    计算机里面所有数都以补码形式保存,加减运算都是补码之间的加法运算。

    原码

    原码就是加了符号位的机器数, 比如一个八位的二进制数, 第一位是符号位, 后面七位是数字位.
    符号位是0, 表示正数, 1表示负数. 但是只能表示255个状态,即-127到+127之间的数字, +0 (00000000)和 -0(10000000)都表示0, 少了一个状态, 由后面的补码解决.

    反码

    所谓反码,英语里又叫ones' complement(对1求补),这里的1,本质上是一个有限位计数系统里所能表示出的最大值,在8位二进制里就是11111111,在1位十进制里就是9,在3位十六进制里就是FFF(再大就要进位了)。求反又被称为对一求补,用最大数减去一个数就能得到它的反,很容易看出在二进制里11111111减去任何数结果都是把这个数按位取反,0变1,1变零,所以才称之为反码。用原码求反码的方法是,正数不变,负数保留符号位1不变,剩下位按位取反。

    求1的反码
        1111 1111
                1
    =   1111 1110
    或者 -1原码就是 1000 0001 符号位不变, 其他为按位取反
    

    补码

    所谓补码,英语里又叫two's complement(对2求补),这个2指的是计数系统的容量(模),就是计数系统所能表示的状态数。对1位二进制数来说只有0和1两种状态,所以模是10也就是十进制的2,对7位二进制数来说就是10000000,这个模是不可能取到的,因为位数多一位。用模减去一个数(无符号部分)就能得到这个数的补,比如10000000-1010010=0101110,事实上因为10000000=1111111+1,稍加改变就成了(1111111-1010010)+1,所以又可以表述为先求反再加1。总结求补码的方法就是正数依旧不变,负数保留符号位不变,先求反码再加上1。
    补数 和 补码的定义式 里面,根本就没有什么符号位。这最高位的1、0是自然出现的,并不是由人来规定的。的确,符号位在补码运算里面是“模”,本身并不带符号的意义。因为计算机将加法转换成加上一个“负数”,而负数又以补码的形式表现。补码比源码多一位,从这多出来的一位可以推断出原来数字的正负号,所以成为了符号位。也可以这样认为,留出一位(不全部占满)的原因是要用“模”来表示正负数。

    这个对于理解补码很关键. 在我的理解模类似各种不同的进制, 比如我们常见的星期, 7进制, 时钟, 12进制, 24进制等.

    -128的补码

     -128的模是10000 0000, 绝对值是128, 二级制是1000 0000
         10000 0000
    -     1000 0000
    =     1000 0000
    

    补码转原码

    补码的第一位是0则是正数, 是1则是负数, 取反后加1就是原码

    本文参考
    这里
    这里

    相关文章

      网友评论

          本文标题:-128补码10000000

          本文链接:https://www.haomeiwen.com/subject/udzsbxtx.html