Difference between revisions of "Minus/fi"
(Created page with "{{Minus}} <div style="float:left; margin: 0 10px 10px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">-</div> [...") |
|||
Line 3: | Line 3: | ||
<div style="float:left; margin: 0 10px 10px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">-</div> | <div style="float:left; margin: 0 10px 10px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">-</div> | ||
− | [[ASCII/fi|ASCII]]:ssa joka on merkistön koodina desimaalisena <syntaxhighlight lang="pascal" | + | [[ASCII/fi|ASCII]]:ssa joka on merkistön koodina desimaalisena <syntaxhighlight lang="pascal" inline>45</syntaxhighlight> |
− | (tai [[Hexadecimal/fi|heksadesimaalisena]] <syntaxhighlight lang="pascal" | + | (tai [[Hexadecimal/fi|heksadesimaalisena]] <syntaxhighlight lang="pascal" inline>2D</syntaxhighlight>) on määritelty |
− | <syntaxhighlight lang="pascal" | + | <syntaxhighlight lang="pascal" inline>-</syntaxhighlight> (miinusmerkiksi). |
<br> <br><br> <br> | <br> <br><br> <br> | ||
Line 11: | Line 11: | ||
== Esiintyminen == | == Esiintyminen == | ||
− | Symboli <syntaxhighlight lang="pascal" | + | Symboli <syntaxhighlight lang="pascal" inline>-</syntaxhighlight> (jota sanotaan “miinusmerkiksi”) käytetään |
* ilmaisemaan että luku on negatiivinen | * ilmaisemaan että luku on negatiivinen | ||
* vähentämään kaksi lukua | * vähentämään kaksi lukua | ||
Line 40: | Line 40: | ||
Varoitus: | Varoitus: | ||
Vähentämisen tulos (ja etumerkki muunnokset) pitäisi tehdä etumerkillisillä kokonaisluvuilla. | Vähentämisen tulos (ja etumerkki muunnokset) pitäisi tehdä etumerkillisillä kokonaisluvuilla. | ||
− | Jos se ei ole, [[sRangechecks|<syntaxhighlight lang="pascal" | + | Jos se ei ole, [[sRangechecks|<syntaxhighlight lang="pascal" inline>{$rangechecks}</syntaxhighlight>]] on otettu käyttöön, se saattaa aiheuttaa ajon aikaisen virheen. |
Kaikissa muissa tapauksissa syntyy aritmeettisesti virheellinen tulos. | Kaikissa muissa tapauksissa syntyy aritmeettisesti virheellinen tulos. | ||
Line 59: | Line 59: | ||
end. | end. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Tämä ohjelma tulostaa <syntaxhighlight lang="pascal" | + | Tämä ohjelma tulostaa <syntaxhighlight lang="pascal" inline>4294967295</syntaxhighlight>, mikä on sama kuin <syntaxhighlight lang="pascal" inline>high(longword)</syntaxhighlight> koska tapahtuu (etumerkittömän) kokonaisluvun ylivuoto. |
On kuitenkin tilanteista, joissa negatiiviset merkit eivät välttämättä aiheuta virheitä. Yritetään "negatiivisen" nollan tallentaminen ei vahingoita: | On kuitenkin tilanteista, joissa negatiiviset merkit eivät välttämättä aiheuta virheitä. Yritetään "negatiivisen" nollan tallentaminen ei vahingoita: | ||
Line 77: | Line 77: | ||
Huomaa myös, että aritmeettinen kokonaisluku operaatio on suoritettu prosessorin natiivilla kokonaislukutyypillä. Vaikka välitulokset eivät ole alueella, | Huomaa myös, että aritmeettinen kokonaisluku operaatio on suoritettu prosessorin natiivilla kokonaislukutyypillä. Vaikka välitulokset eivät ole alueella, | ||
− | <syntaxhighlight lang="pascal" | + | <syntaxhighlight lang="pascal" inline>{$rangechecks on}</syntaxhighlight> tuottaman koodin ansiosta tyypin rajat eivät ylity tuloksen tallentamisen jälkeen. |
<syntaxhighlight lang="pascal" line start="13"> | <syntaxhighlight lang="pascal" line start="13"> | ||
Line 86: | Line 86: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Tämä koko ohjelma päättyy poistumiskoodilla {{Doc|package=RTL|unit=system|identifier=exitcode|text=<syntaxhighlight lang="pascal" | + | Tämä koko ohjelma päättyy poistumiskoodilla {{Doc|package=RTL|unit=system|identifier=exitcode|text=<syntaxhighlight lang="pascal" inline>exitCode</syntaxhighlight>}} |
nolla (tämä tarkoittaa "onnistunutta" ohjelman lopettamista [todellinen arvo saattaa vaihdella eri alustoilla]). | nolla (tämä tarkoittaa "onnistunutta" ohjelman lopettamista [todellinen arvo saattaa vaihdella eri alustoilla]). | ||
Line 92: | Line 92: | ||
Prosessorin alkuperäisluvun kokonaislukujen ylivuotoa ei voida pitää kiinni (tällä tavalla). | Prosessorin alkuperäisluvun kokonaislukujen ylivuotoa ei voida pitää kiinni (tällä tavalla). | ||
[[Assembly language|Assemblerissa]] on pääsy arvioimaan useita tilamerkkejä, mutta Pascalissa ei ole. Sen sijaan voidaan käyttää | [[Assembly language|Assemblerissa]] on pääsy arvioimaan useita tilamerkkejä, mutta Pascalissa ei ole. Sen sijaan voidaan käyttää | ||
− | [[sOverflowchecks|<syntaxhighlight lang="pascal" | + | [[sOverflowchecks|<syntaxhighlight lang="pascal" inline>{$overflowChecks}</syntaxhighlight>]] |
-toimintoa, joka herättää ajon aikaisen virheen. | -toimintoa, joka herättää ajon aikaisen virheen. | ||
Line 110: | Line 110: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | Kääntäjän ohjeella <syntaxhighlight lang="pascal" | + | Kääntäjän ohjeella <syntaxhighlight lang="pascal" inline>{$overflowChecks}</syntaxhighlight> tuotettu koodi on tehokkain , koska se käyttää suoraan saatavilla olevia status flag -arviointiohjeita (esim. "Hyppää jos ylivuoto tapahtui"). Haittapuolena, kerran käynnistetty RTE lopettaa ohjelman väistämättä. Jos tätä pidetään hyvänä, niin on tunnistettava tilanteet, jotka johtavat ylivuotoihin omalla tavalla: |
Latest revision as of 16:18, 6 August 2022
│
English (en) │
suomi (fi) │
français (fr) │
русский (ru) │
ASCII:ssa joka on merkistön koodina desimaalisena 45
(tai heksadesimaalisena 2D
) on määritelty
-
(miinusmerkiksi).
Esiintyminen
Symboli -
(jota sanotaan “miinusmerkiksi”) käytetään
- ilmaisemaan että luku on negatiivinen
- vähentämään kaksi lukua
- muodostavat kahden joukon erotuksen
program minusDemo(input, output, stderr);
var
x: longint;
g: longint;
m: set of (foo, bar);
begin
// yksi operaattori: negatiivinen etumerkki
x := -42; // x saa arvokseen negatiivisen 42
// kaksi operaattoria: lukujen erotus
g := 144 - 169; // g saa arvokseen negatiivisen 25
// kaksi operaattoria: joukkojen ero
m := [foo, bar] - [bar]; // joukko m saa arvokseen joukon {foo}
end.
Toiminta lukujen kanssa
Varoitus:
Vähentämisen tulos (ja etumerkki muunnokset) pitäisi tehdä etumerkillisillä kokonaisluvuilla.
Jos se ei ole, {$rangechecks}
on otettu käyttöön, se saattaa aiheuttaa ajon aikaisen virheen.
Kaikissa muissa tapauksissa syntyy aritmeettisesti virheellinen tulos.
program faultySubtraction(input, output, stderr);
var
x, y: longword;
begin
y := 1;
{$push}
{$rangechecks off} // otherwise the next expression
x := 0 - y; // yields RTE 201
{$pop}
writeLn(x);
end.
Tämä ohjelma tulostaa 4294967295
, mikä on sama kuin high(longword)
koska tapahtuu (etumerkittömän) kokonaisluvun ylivuoto.
On kuitenkin tilanteista, joissa negatiiviset merkit eivät välttämättä aiheuta virheitä. Yritetään "negatiivisen" nollan tallentaminen ei vahingoita:
1program minusOperations(input, output, stderr);
2
3{$rangeChecks on}
4
5var
6 n: longword;
7
8begin
9 // "Negatiivinen" nolla
10 n := 0;
11 n := -n;
Huomaa myös, että aritmeettinen kokonaisluku operaatio on suoritettu prosessorin natiivilla kokonaislukutyypillä. Vaikka välitulokset eivät ole alueella,
{$rangechecks on}
tuottaman koodin ansiosta tyypin rajat eivät ylity tuloksen tallentamisen jälkeen.
13 // välitulokset voivat olla alueen ulkopuolella:
14 n := 1;
15 n := n - n - n + 1;
16end.
Tämä koko ohjelma päättyy poistumiskoodilla exitCode
nolla (tämä tarkoittaa "onnistunutta" ohjelman lopettamista [todellinen arvo saattaa vaihdella eri alustoilla]).
Tämän jälkimmäisen käyttäytymisen seurauksena:
Prosessorin alkuperäisluvun kokonaislukujen ylivuotoa ei voida pitää kiinni (tällä tavalla).
Assemblerissa on pääsy arvioimaan useita tilamerkkejä, mutta Pascalissa ei ole. Sen sijaan voidaan käyttää
{$overflowChecks}
-toimintoa, joka herättää ajon aikaisen virheen.
1program overflowChecksDemo(input, output, stderr);
2
3{$overflowChecks on}
4
5var
6 n: {$ifdef CPU64} int64 {$else} longint {$endif};
7
8begin
9 n := high(n);
10 n := n + 1; // Aiheuttaa ajonaikaisen virheen (RTE) 215
11end.
Kääntäjän ohjeella {$overflowChecks}
tuotettu koodi on tehokkain , koska se käyttää suoraan saatavilla olevia status flag -arviointiohjeita (esim. "Hyppää jos ylivuoto tapahtui"). Haittapuolena, kerran käynnistetty RTE lopettaa ohjelman väistämättä. Jos tätä pidetään hyvänä, niin on tunnistettava tilanteet, jotka johtavat ylivuotoihin omalla tavalla:
1program overflowAnticipation(input, output, stderr);
2
3var
4 n: {$ifdef CPU64} int64 {$else} longint {$endif};
5
6begin
7 // untreated
8 n := high(n);
9 n := n + 1;
10 writeLn(n); // prints low(n)
11
12 // anticipated: reverse operation and comparison w/ 1st operand
13 n := high(n);
14 if high(n) - 1 < n then
15 begin
16 halt(1);
17 end;
18 n := n + 1;
19 writeLn(n);
20end.
Tämä ei tietenkään ole yhtä tehokasta kuin ylivuotorekisterin testaaminen, ja täällä, ilman uudelleenkäytettyä vakiota (constant), on jopa alttiita ohjelmointivirheille (harkitse tilannetta, joka muuttaa vain yhden summan).
single characters |
|
character pairs |
|