C,Delphi ja Java - eroja ja koodia...

Selvitettyäni C ja Java -kielten eroja ja yhtäläisyyksiä sekä vastaavaa koodia...

Ihmettelin aluksi, miksi Delphin "shr" -käskylle on Javassa 2 eri vastinetta:

>> ( assemblerissa sar )
>>> ( assemblerissa shr )

Seuraavaksi oli vuorossa C -kieli.

Mutta: C -kielessä EI ole " >>> " -operaattoria !

Hetken mietittyäni syykin selvisi: C:ssä sitä ei tarvita, koska C:ssä nämä ovat 2 eri asiaa:

int i;
unsigned int u;

Javassa tuo " >>> " tarvitaan, koska Javan kokonaislukutyypit ovat kaikki etumerkillisiä:

byte, short, int, long
(8, 16, 32 ja 64 -bittiset).
shortint, smallint, longint, int64 (Delphin vastaavat; Delphin 32-bittisissä versioissa integer=longint, Delphissä myös 8,16 ja 32 -bittiset etumerkittömät versiot).

Delphin osalta en ole koskaan kokeillut tätä:

var
I : Longint;

begin

I := Longint($80000000);

I := I shr 1;

end;

Mutta jos tuon "Longint" paikalle vaihdetaan "Longword" eli etumerkitön tyyppi, silloin tulos on $40000000.

Seuraavaksi pieni C -kielinen testiohjelma:

int main()
{
printf("\n\nmoi\n");

int i = (int)0x80000000;
int k = i >> 1;

printf("%d ja %d\n",i , k);

unsigned int ui, uk;

ui = i;
uk = ui >> 1;

// ei ole c-kielessä! k = i >>> 1;

printf("%d ja %d\n",ui , uk);

printf("\n");

return 0;
};

----------------

ja testiohjelman tuloste:

moi
-2147483648 ja -1073741824
-2147483648 ja 1073741824

--------------------

Tuo jälkimmäisen rivin -2147483648 on selvästikin tulostusvaiheen moka.

Miten tätä:

printf("%d ja %d\n",ui , uk);

pitäisi muuttaa,jotta unsigned int -tyyppiset arvot tulostuisivat oikein ?
9467
Äänestä

Muut lukivat myös

Vastaukset 9

Vanhimmat

Mitä tarkalleen SHR tekee ?

Äänestä
  • Allaoleva testialiohjelma tulostaa MessageBox -ikkunaan:

    40000000 40000000 C0000000

    ----------------
    Tästä voidaan päätellä, että Delphin shr tekee täsmälleen saman kuin assemblerin shr.

    Eli siis siirtää muuttujan bittejä oikealle niin monella kuin tuon shr sanan jälkeinen argumentti osoittaa. Vasempaan reunaan muodostuva "tyhjä" tila täytetään nollilla. Se, onko muuttuja etumerkillistä vai etumerkitöntä tyyppiä, ei Delphissä eikä assemblerissa vaikuta asiaan.

    Eli yhteenvetona:

    Javan >>> = Delphin shr = assemblerin shr = C-kielen >> unsigned -tyyppiseen muuttujaan kohdistettuna.

    Vastaavasti:

    Javan >> = assemblerin sar = C-kielen >> signed -tyyppiseen muuttujaan kohdistettuna.

    Delphissä ei ole valmiina sar -operaattoria, mutta jos Delphiin tarvitsee tuota muiden kielten tarjoamaa etumerkkiä (nollien sijasta) kopioivaa versiota, niin kopioi allaolevan esimerkkiohjelman funktio sar.

    huom: Delphin muuttujanimissä isot ja pienet kirjaimet ovat samanarvoisia. Eli Delphin kannalta i ja I ovat sama muuttuja.

    ----------------

    function sar(Value:Longword; Count:byte):Longword; register;
    // EAX = Value, DL=Count, Returns EAX
    asm
    mov CL,DL
    sar EAX,CL
    end;

    procedure MyTestA;
    var
    St1, St2, St3, StX : String;
    i,j : Integer;
    U,v,W : Longword;

    begin

    U := $80000000;

    Longword(i) := U;

    j := i shr 1;

    v := U shr 1;

    W := sar(U, 1);

    St1 := IntToHex(j,8);

    St2 := IntToHex(v,8);

    St3 := IntToHex(W,8);

    StX := St1 ' ' St2 ' ' St3;

    Windows.MessageBox(0, PChar(StX), 'Testi A', MB_OK)
    end;

    Äänestä

  • Mika0800 kirjoitti:

    Allaoleva testialiohjelma tulostaa MessageBox -ikkunaan:

    40000000 40000000 C0000000

    ----------------
    Tästä voidaan päätellä, että Delphin shr tekee täsmälleen saman kuin assemblerin shr.

    Eli siis siirtää muuttujan bittejä oikealle niin monella kuin tuon shr sanan jälkeinen argumentti osoittaa. Vasempaan reunaan muodostuva "tyhjä" tila täytetään nollilla. Se, onko muuttuja etumerkillistä vai etumerkitöntä tyyppiä, ei Delphissä eikä assemblerissa vaikuta asiaan.

    Eli yhteenvetona:

    Javan >>> = Delphin shr = assemblerin shr = C-kielen >> unsigned -tyyppiseen muuttujaan kohdistettuna.

    Vastaavasti:

    Javan >> = assemblerin sar = C-kielen >> signed -tyyppiseen muuttujaan kohdistettuna.

    Delphissä ei ole valmiina sar -operaattoria, mutta jos Delphiin tarvitsee tuota muiden kielten tarjoamaa etumerkkiä (nollien sijasta) kopioivaa versiota, niin kopioi allaolevan esimerkkiohjelman funktio sar.

    huom: Delphin muuttujanimissä isot ja pienet kirjaimet ovat samanarvoisia. Eli Delphin kannalta i ja I ovat sama muuttuja.

    ----------------

    function sar(Value:Longword; Count:byte):Longword; register;
    // EAX = Value, DL=Count, Returns EAX
    asm
    mov CL,DL
    sar EAX,CL
    end;

    procedure MyTestA;
    var
    St1, St2, St3, StX : String;
    i,j : Integer;
    U,v,W : Longword;

    begin

    U := $80000000;

    Longword(i) := U;

    j := i shr 1;

    v := U shr 1;

    W := sar(U, 1);

    St1 := IntToHex(j,8);

    St2 := IntToHex(v,8);

    St3 := IntToHex(W,8);

    StX := St1 ' ' St2 ' ' St3;

    Windows.MessageBox(0, PChar(StX), 'Testi A', MB_OK)
    end;

    Mitä SAE sitten tekee?

    Äänestä

  • Entä SAR kirjoitti:

    Mitä SAE sitten tekee?

    tekee saman kuin SHR paitsi että ei koske siihen bittiin joka määrittää onko luku positiivinen vai negatiivinen. eli SAR:n jälkeen luku on edelleen positiivinen jos se oli ennen SARia positiivinen tai negatiivinen jos se oli ennen SARia negatiivinen.

    Äänestä

mutta mistä tämä vertailu?

Vikka kielten syntaksi muistuttaa toisiaan, kielillä ei ole mitään tekemistä tpostensa kanssa:

Ensinnäkin Java ei ole kääntäjä, vaan tulkki (verrattavissa Basicin kanssa).

Delphi ja C ovat kääntäjiä. Delphi, aikaisemmin tunnettu nimellä Object Pascal on Borlandin ja MS:n kyhämä yhteistuote, tarkoitettu opetuskäyttöön, lisenssi kieltää kaupallisten sovellusten tekemistä sillä (voidaan kiertää Lasaruksella).

C on näistä ainoa täysipainoinen ohjelmointikieli jolla on "roskankeräystä" (TRY-CATCH-...) joka estää muistiylivuotoja ym, multiple inheritance,....Se on ainoa kieli jolla tehdään itsenäisiä kaupallisia sovelluksia (Jos tilaaja tilaa ohjelman joka on tehty Javalla tai Delphillä se johtuu ainoastaan että häneltä puuttuu väkeä joka osaisi ylläpitää C/C ohjelmaa ja sovellus ei ole aikakriittinen).

Äänestä

Kommentoi aloitusta


Mika0800 kirjoitti:

Selvitettyäni C ja Java -kielten eroja ja yhtäläisyyksiä sekä vastaavaa koodia...

Ihmettelin aluksi, miksi Delphin "shr" -käskylle on Javassa 2 eri vastinetta:

>> ( assemblerissa sar )
>>> ( assemblerissa shr )

Seuraavaksi oli vuorossa C -kieli.

Mutta: C -kielessä EI ole " >>> " -operaattoria !

Hetken mietittyäni syykin selvisi: C:ssä sitä ei tarvita, koska C:ssä nämä ovat 2 eri asiaa:

int i;
unsigned int u;

Javassa tuo " >>> " tarvitaan, koska Javan kokonaislukutyypit ovat kaikki etumerkillisiä:

byte, short, int, long
(8, 16, 32 ja 64 -bittiset).
shortint, smallint, longint, int64 (Delphin vastaavat; Delphin 32-bittisissä versioissa integer=longint, Delphissä myös 8,16 ja 32 -bittiset etumerkittömät versiot).

Delphin osalta en ole koskaan kokeillut tätä:

var
I : Longint;

begin

I := Longint($80000000);

I := I shr 1;

end;

Mutta jos tuon "Longint" paikalle vaihdetaan "Longword" eli etumerkitön tyyppi, silloin tulos on $40000000.

Seuraavaksi pieni C -kielinen testiohjelma:

int main()
{
printf("\n\nmoi\n");

int i = (int)0x80000000;
int k = i >> 1;

printf("%d ja %d\n",i , k);

unsigned int ui, uk;

ui = i;
uk = ui >> 1;

// ei ole c-kielessä! k = i >>> 1;

printf("%d ja %d\n",ui , uk);

printf("\n");

return 0;
};

----------------

ja testiohjelman tuloste:

moi
-2147483648 ja -1073741824
-2147483648 ja 1073741824

--------------------

Tuo jälkimmäisen rivin -2147483648 on selvästikin tulostusvaiheen moka.

Miten tätä:

printf("%d ja %d\n",ui , uk);

pitäisi muuttaa,jotta unsigned int -tyyppiset arvot tulostuisivat oikein ?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu