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 ?
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 ?
Vastaukset 9
Vanhimmat
Mitä tarkalleen SHR tekee ?
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?
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.
kokeile korvata se tällä:
printf("%u ja %u",plääplpää)
http://www.cppreference.com/stdio/printf.html
tuolla ainakin sanotaan että %d käytetään juuri signed integerien tulostukseen
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).
Luulisi että esim. 4300,- euroa maksavalla Delphillä voisi tehdä kaupallisia ohjelmia.
http://www.moonsoft.fi/products/000341.aspx
Poikkeukset ovat myös Pascalissa.
http://fi.wikipedia.org/wiki/Poikkeukset
Moniperintää ei ole Pascalissa (eikä Javassa) mutta sen voi korvata
rajapinnalla. Kuten varmaan tiedät niin (jos jotain ymmärrät) niin
moniperintään liittyy hyvin paljon ongelmia (eikä siksi ole mikään
ratkaisevan tärkeä ominaisuus).
Delphi
http://wiki.mureakuha.com/wiki/Delphi
on vain Borlandin kehittämä tuote joka pohjautuu Turbo Pascaliin.
http://fi.wikipedia.org/wiki/Turbo_Pascal
Jos etsit tuotetta jossa olisi MS:n ja Borlandin yhteistyötä niin silloin
tarkoittanet ennemmin C#:a.
http://fi.wikipedia.org/wiki/C_sharp#Historia
..ms:llä ei delphin kanssa ole mitään tekemistä, ja kaupallisten sovellusten rajoitus koskee vain ilmaiseksi jaettavaa personal editionia, ei virallisia lisenssejä, muutoin suomessakin kaupattais monia laittomia ohjelmia ihan ostoskanavaa myöten.