进制转换_负数的补码

补码:

  • 假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,
    即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,
    加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。

  • 计算机系统中减法问题也可以化成加法问题,
    只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码

  • 例:求-5的补码。
    -5对应负数5(00000101)→所有位取反(11111010)→加00000001(11111011)
    所以-5的补码是11111011。

  • 0的补码
    数0的补码表示是唯一的
    [+0]补=[+0]反=[+0]原=00000000
    [-0]补=11111111+1=00000000

进制转换问题


//1、把⼀个⼗进制数转为八进制
//思路:用do{}while();循环,保证str里有数字
//每次循环num先取余8拼到str里,之后num整除8赋值给自己,直到num到0为⽌。
public static String decToOct(int num) {
    if (num < 0) {
        //          -10的二进制是:   ‭1_777_777_777_777_777_777_766‬
        //            10的八进制是   0_000_000_000_000_000_000_012
        //            所以,八进制正数是最高位是0
        //            八进制负数是最高位是1
        return"num<0";
    }
    String str = "";
    do {
        int mod = num % 8;
        str = mod + str;
        num /= 8;
    } while (num != 0);
    return str;
}

//2、把⼀个⼗进制数转为二进制
//思路:同理
public static String decToBin(int num) {
    if (num < 0) {
        //          -10的二进制是:   ‭(57个1)_1111_0110‬
        //            10的二进制是   ‭(57个1)_0000_1010
        //            所以,二进制正数是最高位是0
        //            二进制负数是最高位是1
        return"num<0";
    }
    String str = "";
    do {
        int mod = num % 2;
        str = mod + str;
        num /= 2;
    } while (num != 0);
    return str;
}

//3、把⼀个⼗进制数转为⼗六进制
//思路:多了ABCDEF分别对应10进制的10,11,12,13,14,15
//创建一个数组,进行数组下标对应,不用if判断了
public static String decToHex(int num) {
    if (num < 0) {
        //          -10的⼗六进制是:   ‭FFFF_FFFF_FFFF_FFF6‬
        //            10的⼗六进制是   0000_0000_0000_000A
        //            所以,⼗六进制正数是最高位是0
        //            ⼗六进制负数是最高位是F
        return"num<0";
    }
    char[] chars = "0123456789ABCDEFG".toCharArray();
    String str = "";
    do {
        int mod = num % 16;
        str = chars[mod] + str; //取出余数,拼接
        num /= 16;
    } while (num != 0);
    return "ox"+str;
}




原码

原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值,

  • 符号位位“0”时表示正数,

  • 符号位为“1”时表示负数,

  • 原码又称带符号的绝对值。

  • 为了方便整数和小数区别,整数的符号位与数值位之间用“,”隔开,小数的符号位与数值位之间用“.”隔开。

反码

反码通常是用来由原码求补码或者由补码求原码的过渡码。

  • “+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000

  • 反码为0,0000000;整数的“-0”原码为1,0000000,反码为1,1111111;小数的“+0”原码为0.0000000,反码为0.0000000;小数的“-0”原码为1.0000000

  • 小数的“-0”反码为1.1111111。

  • 反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。

原文地址:https://www.cnblogs.com/k-class/p/14193257.html