Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Typ long

Aktivity
Avatar
dinokino
Člen
Avatar
dinokino:5.3.2015 21:49

Dobrý den, učím se programovat v javě podle knihy a narazil jsem na drobný problém...
Mám dvě třídy. První třída:

public class Trida {
    int pocetBitu;
    Trida(int pocet){
        pocetBitu=pocet;
    }
    void vrat(long hodnota){
        long maska =1;
        maska <<= pocetBitu -1;
        int pocitadlo = 0;
        for(;maska !=0;maska >>=1){
            if ((maska & hodnota) != 0){System.out.print("1");}
            else System.out.print("0");
            pocitadlo++;
            if ((pocitadlo%8)==0) {
                System.out.print(" ");
                pocitadlo=0;
            }
        }
        System.out.print("\n");
    }
}

A třída s metodou main():

public class Pokusy {
    public static void main(String[] args){
Trida cislo=new Trida (63);
Trida cislo2=new Trida (64);
cislo.vrat(10);
cislo2.vrat(10);
}
}

Program vygeneruje číslo:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 0001010 kvůli metoďe vrat(10) oběktu cislo. Dále se ale najednou začne vypisovat "nekonečné číslo"...Nechápu proč. Napadá mě, že to souvisí s maximální délkou typu long- 64 bitů(druhý oběkt -oběkt cislo2 - je nastaven tak, aby zobrazoval 64 bitů čísla). Pak ale nechápu proč to v knize uváději v příkladu(a dále není nikde uvedeno, že kód "nebude fungovat") :D

Editováno 5.3.2015 21:50
 
Odpovědět
5.3.2015 21:49
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:5.3.2015 23:06

Nejsem javista, ale zkusím si tipnout:

Typ long je 64bitové znaménkové celeé číslo, což implikuje jeho rozsah na -263 - 263−1. To znamená, že jeho bity 0 až 62 zaplní vlastní číslo (v doplňkovém kódu) a bit 63 (ten nejvýznamnější) bude uchovávat znaménko.

Zápis

maska <<= pocetBitu -1;

nastaví bit 63 na 1, je-li pocetBitu rovno 64 (což je v případě druhého volání metody vrat). Tím vlastně vyrobíš číslo -263.

Zápis

maska >>=1

je posunem vpravo o jeden bit. Posuny vpravo existují dva: logický a aritmetický. Tne logický prostě posune všechny bity operandu o jeden doprava a na místo nejvýznamnějšího zapíše nulu. Ten aritmetický místo zápisu nuly kopíruje hodnotu znaménkového bitu. Což by v tvém případě znamenalo, že se maska nikdy nenastaví na nulu, nýbrž bude nakonec vyplněna samými jedničkami.

Nevím jistě, zda operátor >> v Javě implicitně znamená aritmetický posun vpravo (zejména u znaménkového datového typu), ale tebou popisované chování tomu nasvědčuje.

Nahoru Odpovědět
5.3.2015 23:06
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.