错误:int类型的文字1111111111111000超出范围

这是我正在测试的方法

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类型的文字1111111111111000超出范围,在JUnit中来自

    @Test
public void testNegativeDecimal() { 
    int data = -8; 
    assertEquals(1111111111111000,Convert.convertDecimalTo2sComp(data)); }

我该如何解决?

crediblebridge 回答:错误:int类型的文字1111111111111000超出范围

您的问题是您输入的数字超出了整数范围(最大值为2 ^ 31-1 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

由于您已将其声明为文字Java,因此假定您的数字为整数。

最简单的声明数字应为Long的方式(最大值为2 ^ 63-1) assertEquals(1111111111111000L,Convert.convertDecimalTo2sComp(data));

当然,为了便于阅读,您也可以选择使其明确

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

1111111111111000,因为int确实在int范围之外。 10 ^ 16 =约。 2 ^ 48 确实,您打算拥有一个char数组:

Notification

或更懒惰,更不易出错的解决方案:

JavascriptExecutor jsDriver = (JavascriptExecutor) driver;
jsDriver.executeScript("lastNotification.dispatchEvent(new Event('click'))");

后者的优点是在出错时您会看到(人类可读的)字符串。

,

让我首先解决您的潜在困惑。

从方法名convertDecimalTo2sComp和参数名decimal来看,您期望参数在某种意义上为“十进制”(以10为底)。但是实际上,这是不对的:参数只是范围为[−2 31 ,2 31 -1],不是的整数特别是该整数的以10为底的表示形式。实际上,在内部,它实际上表示为二进制补码二进制整数(例如,如果整数为-8,则在内部以1111 1111 1111 1111 1111 1111 1111 1000表示),但这仅在使用诸如{ {1}}(按位“和”)和&(右移)。它可能似乎类似于以10为基数表示的整数,因为默认情况下,往返于字符串的转换使用10为基数(例如>>等效于Integer.toString(32)和{{1} }等效于Integer.toString(32,10),并且因为我们通常在源代码中以十进制形式编写它们(例如,我们通常将整数32编写为Integer.valueOf("32")而不是Integer.valueOf("32",10)或{{1 }}或32);但这仅仅是为了我们的方便,与内部表示无关。

因此,举例来说,这些语句完全等同于

0x20

因为在所有情况下,整数32在内部都表示为040


将其清除。 。

要断言某个字符数组包含13个0b10_0000-s和三个System.out.println(32); System.out.println(0x20); System.out.println(040); System.out.println(0b100000); System.out.println(0b_0010_0000); -s,则可以使用0000 0000 0000 0000 0000 0000 0010 0000 [link],也可以使用可以将'1'转换为'0'并使用Assert.assertArrayEquals。因此,其中任何一个:

char[]
本文链接:https://www.f2er.com/2760500.html

大家都在问