Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 错误:int类型的文本1111 000超出范围_Java_Junit_Binary_Literals_Twos Complement - Fatal编程技术网

Java 错误:int类型的文本1111 000超出范围

Java 错误:int类型的文本1111 000超出范围,java,junit,binary,literals,twos-complement,Java,Junit,Binary,Literals,Twos Complement,这就是我正在测试的方法 public static char[] convertDecimalTo2sComp(int decimal) { char [] bits = new char [16]; double temp; int tempInt; String bitStr = " "; for(int i = bits.length-1; i>=0; i--) { //negative input if(d

这就是我正在测试的方法

public static char[] convertDecimalTo2sComp(int decimal) {
    char [] bits = new char [16];
    double temp;
    int tempInt;
    String bitStr = " ";


    for(int i = bits.length-1; i>=0; i--) {
        //negative input
        if(decimal <1) {
            temp = Math.pow(2,16); //add 2^number of bits, then convert to binary
            decimal += (int)temp;
        }
        //non-negative input
        tempInt = decimal%2;
        bitStr = tempInt + bitStr;
        decimal/=2;

    }
    bits = bitStr.toCharArray();

    return bits;
}

如何解决此问题?

您的问题是,您给出的数字超出了int的范围(最大值为2^31-1)

因为您已经将其声明为文字,所以java假定您的数字是一个int

声明数字应改为Long(最大值为2^63-1)的最简单方法
assertEquals(1111000l,Convert.convertdecmalto2scomp(数据))

当然,为了可读性,您也可以选择将其显式化

long expected = 1111111111111000;
assertEquals(expected, Convert.convertDecimalTo2sComp(data));

1111111000 as int确实超出int范围。10^16=约2^48 实际上,您打算使用char数组:

public void testNegativeDecimal() { 
    int data = -8; 
    char[] expected = "1111111111111000".toCharArray();
    assertEquals(expected, Convert.convertDecimalTo2sComp(data));
}
或者更懒惰、更不容易出错的解决方案:

public void testNegativeDecimal() { 
    int data = -8; 
    String expected = "0000000000000000" + Integer.toBinaryString(data);
    expected = expect.substring(expected.length() - 16);
    assertEquals(expected, new String(Convert.convertDecimalTo2sComp(data)));
}

后者的优点是,一旦出现错误,您就会看到(人类可读的)字符串。

让我从解决您潜在的困惑开始

从方法名
convertDecimalTo2sComp
和参数名
decimal
判断,您希望参数在某种意义上是“decimal”(以10为基数)。但事实并非如此:参数只是范围内的一个整数[−231,231−1] ,而不是该整数的10进制表示形式。实际上,在内部,它实际上被表示为一个2的补码二进制整数-例如,如果整数是−8,则它在内部表示为
11111111111111111 000
——但这仅在使用位级操作时才起作用,例如
&
(按位“and”)和
>
(右移)。似乎整数是以10为基数表示的,因为与字符串之间的转换默认使用10为基数(例如,
Integer.toString(32)
相当于
Integer.toString(32,10)
Integer.valueOf(“32”)
相当于
Integer.valueOf(“32,10”)
,因为我们通常在源代码中以十进制形式写入它们(例如,我们通常将整数32写入
32
,而不是
0x20
040
0b10_0000
);但这只是为了我们的方便,与内部代表无关

例如,这些语句都是完全等价的:

System.out.println(32);
System.out.println(0x20);
System.out.println(040);
System.out.println(0b100000);
System.out.println(0b_0010_0000);
因为在所有情况下,整数32在内部都表示为
00000000000000000000 100000


清理完毕后

要断言某个内容是一个字符数组,它包含十三个
'1'
-s,后跟三个
'0'
-s,您可以使用
assert.assertarayequals
[],也可以将
char[]
转换为
字符串
并使用
assert.assertEquals
。因此,其中任何一项:

assertArrayEquals(
    new char[] {
        '1', '1', '1', '1',  '1', '1', '1', '1',
        '1', '1', '1', '1',  '1', '0', '0', '0'  },
    Convert.convertDecimalTo2sComp(data);

assertArrayEquals(
    "1111111111111000".toCharArray(),
    Convert.convertDecimalTo2sComp(data));

assertEquals(
    "1111111111111000",
    new String(Convert.convertDecimalTo2sComp(data)));
assertArrayEquals(
    new char[] {
        '1', '1', '1', '1',  '1', '1', '1', '1',
        '1', '1', '1', '1',  '1', '0', '0', '0'  },
    Convert.convertDecimalTo2sComp(data);

assertArrayEquals(
    "1111111111111000".toCharArray(),
    Convert.convertDecimalTo2sComp(data));

assertEquals(
    "1111111111111000",
    new String(Convert.convertDecimalTo2sComp(data)));