ошибка: литерал 1111111111111000 типа int находится вне диапазона - PullRequest
0 голосов
/ 16 января 2020

Это метод, который я тестирую

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;
}

И вот что я получаю сообщение об ошибке: Литерал 1111111111111000 типа int находится вне диапазона, в JUnit от

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

Как мне это исправить?

Ответы [ 3 ]

0 голосов
/ 16 января 2020

1111111111111000, поскольку int действительно находится вне диапазона int. 10 ^ 16 = ок. 2 ^ 48 Действительно, вы намеревались иметь массив символов:

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)));
}

Последнее имеет то преимущество, что при появлении ошибки (человекочитаемые) строки.

0 голосов
/ 16 января 2020

Позвольте мне начать с рассмотрения вашей путаницы.

Судя по вашему имени метода convertDecimalTo2sComp и вашему параметру decimal, вы ожидаете, что аргумент будет "десятичным" (base- 10) в каком-то смысле. Но на самом деле это не так: аргумент - это просто целое число в диапазоне [−2 31 , 2 31 -1], , а не , в частности, основание -10 представление этого целого числа. Внутренне, на самом деле, он фактически представлен в виде двоичного целого числа с дополнением до двух - например, если целое число равно -8, то он представлен внутри как 1111 1111 1111 1111 1111 1111 1111 1000 - но это имеет значение только при использовании операций на уровне битов, таких как & (поразрядно "и") и >> (сдвиг вправо). может показаться как целые числа, представленные в базе 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 внутренне представляется как 0000 0000 0000 0000 0000 0000 0010 0000.


с этим уточненным. , .

Чтобы утверждать, что что-то представляет собой массив символов, содержащий тринадцать '1' -s, за которыми следуют три '0' -s, вы можете либо использовать Assert.assertArrayEquals [ link ], либо можно преобразовать char[] в String и использовать 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)));
0 голосов
/ 16 января 2020

Ваша проблема в том, что число, которое вы дали, находится за пределами диапазона целого числа (которое имеет максимальное значение 2 ^ 31-1 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)

Так как вы объявили его как литерал java предполагает, что вашим числом является целое число.

Самый простой способ объявить, что число должно быть длинным (а его максимальное значение равно 2 ^ 63-1). ) assertEquals(1111111111111000L, Convert.convertDecimalTo2sComp(data));

Конечно, вы также можете сделать это явным для удобства чтения

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