Odejmowanie typu long - problem

0

Witam!

Czemu jak chce odjąć:

 
public static void main(String[] args) {
		long liczba1 = 10 * 50 * 100 * 1000 * 1000;
		long liczba2 = 10 * 50 * 100 * 1000;
	
		System.out.println(liczba1/liczba2);
	}

to wyskakuje -30 zamiast 1000 ??

1

No ale ty nie odejmujesz tyko dzielisz ...

0

Przekraczasz maksymalny rozmiar tego typu i liczba sie "przekreca". Zapewne masz 32-bitowy system.

0
static BigInteger Czynniki_Pomnoz(String... czynniki)
	{
		BigInteger output = new BigInteger(czynniki[0]);
		int a = czynniki.length;
		for(int i=1;i<a;i++)
			output = output.multiply(new BigInteger(czynniki[i]));
		return output;		
	}
public static void main(String[] args) {
                BigInteger liczba1 = Czynniki_Pomnoz("10","50","100","1000");
	 	BigInteger liczba2 = Czynniki_Pomnoz("10","50","100");
		System.out.println(liczba1.divide(liczba2));
		
        }

Przy większych liczbach musisz wykorzystać tę klasę i jej metody.

0
n0name_l napisał(a):

Przekraczasz maksymalny rozmiar tego typu i liczba sie "przekreca". Zapewne masz 32-bitowy system.

Long w Javie jest zawsze 64-bitowy. Int jest zawsze 32-bitowy.

1
  1. AFAIK Long != long.
  2. Defaultowo vm uzyje typu int, a ten typ jest 32-bitowy (tak umiem czytac dokumentacje)
  3. Trzeba dodac L do jednej badz kilku mnozonych liczb:
public class Main
{ 
    public static void main(String [] args)
        {
        long liczba1 = 10 * 50 * 100 * 1000 * 1000;
        long liczba2 = 10 * 50 * 100 * 1000;
        System.out.println(liczba1/liczba2);
        
        long liczba3 = 50000000000L;
        long liczba4 = 10 * 50 * 100 * 1000;
        System.out.println(liczba3/liczba4);
        
        long liczba5 = 10L * 50L * 100L * 1000L * 1000L;
        long liczba6 = 10 * 50 * 100 * 1000;
        System.out.println(liczba5/liczba6);
        
        long liczba7 = 10 * 50 * 100 * 1000 * 1000L;
        long liczba8 = 10 * 50 * 100 * 1000;
        System.out.println(liczba7/liczba8);
        }
}

http://ideone.com/DmhN8A

0
  1. Defaultowo vm uzyje typu int, a ten typ jest 32-bitowy (tak umiem czytac dokumentacje)

Nie VM, a kompilator.

Dobrze trafiłeś - domyślnie liczby są traktowane jako inty, więc by mieć wynik 64-bitowy trzeba dodać L zanim (bo liczone jest od lewej do prawej) się wynik przepełni.

Obliczenia w Javie wykonują się tak samo, bez względu na to ile bitów mają rejestry procesora, na jaką architekturę jest VMka itp itd Long/ long to zawsze 64-bity, Integer/ int to zawsze 32-bity. Jedynie liczby zmiennoprzecinkowe mogą inaczej działać, ale wystarczy dać strictfp i już jest wszędzie identycznie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.