计算机系统中数据的运算原理(上)

一.计算机系统中整数的运算

  • 1.补码的介绍
    Java中的数据都是有符号的数,Java不支持无符号的整数,计算机中带符号的整数的运算都是通过其二进制的补码实现,因为计算机中只有加法器,没有减法器,减法运算时不能直接将原码相加

    原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小
    反码:表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外
    补码:表示法规定:正数的补码与其原码相同;负数的补码是其反码加1

  • 2.整数的加减法
    如上,加减法都用加法的形式计算,以byte类型整数为例(其他类型范围太大,不适合举例),其在计算机内存中用8位二进制码表示整数,最高位为符号位,0为正,1为负,其余七位表示数值大小。
    附:Java中Byte类型数据运算细节

    最大值为原码 01111111的本身,十进制即为127,最小的补码为 10000000,我们通过负数取补码的逆过程,减一得 01111111,取反得 10000000,此时用到了第八位最高位,加上原来符号且化为十进制即为-128。

    限定二进制位数的补码如同一个圆周,最大值整数与最小值整数相邻,最大值加一即为最小值
    例:十进制整数127二进制表示为 01111111,补码与其相同,整数1的二进制补码为00000001
    127 + 1 = 01111111 + 00000001 = 10000000
    10000000为-128的补码

  • 3.整数的乘除法
    计算机中整数的乘除法是将十进制整数化为二进制,并获取其补码,然后对补码进行移位操作,仍取byte类型为例,8位二进制码的左移一位操作就是将最高位挤出,最低位补0,右移就是将最低为挤出,最高位补0(这也是为什么Java中整数除法运算不能得到小数部分的原因)
    例:十进制整数127的二进制补码为 01111111,整数3的二进制补码为00000011
    127 * 2 = 01111111 * 00000011
    = 01111111*00000010 + 01111111*000000001
    = 01111111左移1位 + 01111111左移0位
    = 11111110 + 01111111
    = 01111101
    = 125

    除法的右移跟乘法相反
    例:十进制整数5的二进制补码为00000101,整数3的二级制补码为00000011
    5 / 3 = 00000101 / 00000011
    = 00000100/00000011 + 00000001/000000011
    =00000001 余00000001
    =1
    整数运算余数会被舍弃,浮点数的时候才会继续运算
    注:以上全属笔者个人理解,如有错误,欢迎指正,不接受批评!

猜你喜欢

转载自blog.csdn.net/qq_20107237/article/details/81156884
今日推荐