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