在java中将32位十六进制转换为十进制

在java中将32位十六进制转换为十进制,java,hex,bits,twos-complement,Java,Hex,Bits,Twos Complement,对于作业,我必须编写一个程序,该程序将接收8个字符的字符串(十六进制),然后将其转换为10进制。我不允许使用任何课外课程来做这件事。我很确定我的工作正常。。。仅适用于正数。我的问题是如何显示负数。 例如,FFFFF A应打印为-6 这是到目前为止我的代码 package hexconverter; import java.util.*; /** * * @author Steven */ public class Main { Scanner scanner = new Sc

对于作业,我必须编写一个程序,该程序将接收8个字符的字符串(十六进制),然后将其转换为10进制。我不允许使用任何课外课程来做这件事。我很确定我的工作正常。。。仅适用于正数。我的问题是如何显示负数。 例如,FFFFF A应打印为-6 这是到目前为止我的代码

package hexconverter;

import java.util.*;

/**
 *
 * @author Steven
 */
public class Main {

    Scanner scanner = new Scanner(System.in);

    public void doWork() {



        System.err.println("Please enter the internal representation: ");
        String hex;
        hex = scanner.next();
        hex = hex.toUpperCase();

        long count = 1;
        long ans = 0;

        for (int i = 7; i >= 0; i--) {
            Character c = hex.charAt(i);

            if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5' && c != '6' && c != '7' && c != '8' && c != '9') {
                int num = fixLetters(c);
                ans = ans + (num * count);
                count = count * 16;
            } else {

                String s = c.toString(c);
                long num = Integer.parseInt(s);
                ans = ans + (num * count);
                count = count * 16;
            }
        }

       if (ans > 2147483647) {
            System.out.println("is negative");


       } else {
            System.out.println(ans);
       }
    }

    public int fixLetters(Character c) {
        if (c.equals('A')) {
            return 10;
        } else if (c.equals('B')) {
            return 11;
        } else if (c.equals('C')) {
            return 12;
        } else if (c.equals('D')) {
            return 13;
        } else if (c.equals('E')) {
            return 14;
        } else if (c.equals('F')) {
            return 15;
        } else {
            return 0;
        }

    }

    public static void main(String[] args) {
        // TODO code application logic here
        Main a = new Main();
        a.doWork();
    }
}
我认为我对负整数的测试是正确的。。。因为这是32位所能容纳的最高值,任何超过该值的值都将是溢出,这意味着它应该是负数。 从这里开始,我不知道该怎么做。如有任何指示或提示,将不胜感激。如果在数学上没有办法,我觉得我必须将十六进制转换成二进制,然后对它执行两个补码,但我也不知道从哪里开始

提前感谢

如果代码中的数字为负数(>2147483647),只需从中减去
2^32
(4294967296)。然后打印出来

if (ans > 2147483647) {
        System.out.println(ans - 4294967296L);
   } else {
        System.out.println(ans);
   }
如果代码中的数字为负数(>2147483647),只需从中减去
2^32
(4294967296)。然后打印出来

if (ans > 2147483647) {
        System.out.println(ans - 4294967296L);
   } else {
        System.out.println(ans);
   }

在32位2的补码二进制表示法中,负数的值正好比无符号表示法中相同位模式的值小2^32。您已经确定该数字可能为负数;剩下要做的就是减去2^32

当然,2^32(十进制为4294967296,十六进制为0x100000000)是一个不能用Java的“int”类型表示的值,因此需要使用“long”:


在32位2的补码二进制表示法中,负数的值正好比无符号表示法中相同位模式的值小2^32。您已经确定该数字可能为负数;剩下要做的就是减去2^32

当然,2^32(十进制为4294967296,十六进制为0x100000000)是一个不能用Java的“int”类型表示的值,因此需要使用“long”:


非常感谢。我真不敢相信我没有看到自己似乎工作得很好。谢谢!我不敢相信我没有看到自己似乎工作得很完美。因为一半是积极的,一半是消极的,对吗?谢谢你,我错过了@装满鳗鱼的气垫船:上次我检查时,
2^31=2147483648
sh!t、 你说得对(我会很快删除我的评论。对不起!因为一半是正面的,一半是负面的,对吗?谢谢你,我错过了!@Hovercraft Full-Of-Eels:上次我检查时,
2^31=2147483648
sh!t,你是对的。:(我会很快删除我的评论。对不起!