пытаясь проверить диапазон длинного в java.. почему эта программа не работает? он дает бесконечный цикл (возможно). я не получаю вывод в командной строке, и курсор продолжает мигать.
class range
{
public static void main(String [] args)
{
long i;
for(i=0;;i++)
{
long c= (long)(i+1);
if(i>c) //upper_limit+1=lower_limit
break; // hence, at i=upper_limit c(=i+1) < i
}
System.out.println("upper ="+i);
for(i=-1;;i--)
{
long c=(long)(i-1);
if(i<c) //lowerlimit-1=upperlimit
break; //hence at i=lowerlimit c(=i-1)>i
}
System.out.println("lower ="+i);
}
}
Ваша программа будет работать в конечном итоге, но сначала ей нужно выполнить 2 63 итерации (в каждом направлении). Это займет очень много времени. Long.MAX_VALUE
и Long.MIN_VALUE
- это более простые способы выяснить это. Или просто посмотрите JLS 4.2.1:
Значения интегральных типов являются целыми числами в следующих диапазонах:
...
long
от -9223372036854775808 до 9223372036854775807 включительно
Если вы хотите, чтобы ваша программа находила правильные значения, просто запустите ее ближе к окончательному результату:
for(i=Long.MAX_VALUE - 10;;i++)
...
for(i=Long.MIN_VALUE + 10;;i--)
Это быстро заканчивается выходом:
upper =9223372036854775807
lower =-9223372036854775808
i > c
никогда не буду true
.. Нет?
Long.MAX_VALUE + 1
, вы увидите :)
Почему, по-вашему, ваша программа неверна? Это займет много времени - до тех пор, пока не переполнятся (около 2 ^ 63 итераций). Я предлагаю вам использовать Long.MIN_VALUE
и Long.MIN_VALUE
или если вы хотите избежать этого решения, используйте двоичный поиск, когда происходит переполнение.
Также вы можете использовать short
версию той же программы, чтобы убедиться, что она правильная, просто очень трудоемкая.
Нет причин начинать с 0 или -1.
Если вы хотите проверить значения MIN/Max, попробуйте сделать это следующим образом:
class range
{
public static void main(String [] args)
{
long i;
for(i=Long.MAX_VALUE;;i++)
{
long c= (long)(i+1);
if(i>c) //upper_limit+1=lower_limit
break; // hence, at i=upper_limit c(=i+1) < i
}
System.out.println("upper ="+i);
for(i=Long.MIN_VALUE;;i--)
{
long c=(long)(i-1);
if(i<c) //lowerlimit-1=upperlimit
break; //hence at i=lowerlimit c(=i-1)>i
}
System.out.println("lower ="+i);
}
}
Вы можете использовать Long.MAX_VALUE и Long.MIN_VALUE
Это займет много времени, чтобы перечислить все 2 ^ 64 возможных длинных значения
Long.MAX_VALUE
для вас слишком популярно?