Sign in Join
Wiki copytemporary

Minus/fi: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-<div style="float:left; margin: 0 10px 10px 0; padding:40px; font-size:500%; font-family: Georgia; background-color: #f9f9f9; border: 2px solid #777777;">
2-
31\-
42
5-</div>
6-
73[[ASCII/fi|ASCII]]:ssa joka on merkistön koodina desimaalisena `45` (tai [[Hexadecimal/fi|heksadesimaalisena]] `2D`) on määritelty `-` (miinusmerkiksi).
8-
9-\
10-\
11-\
12-\
134
145## Esiintyminen
156
167Symboli `-` (jota sanotaan “miinusmerkiksi”) käytetään
178
189- ilmaisemaan että luku on negatiivinen
1910- vähentämään kaksi lukua
2011- muodostavat kahden [[Set/fi|joukon]] erotuksen
2112
2213``` pascal
2314program minusDemo(input, output, stderr);
2415
2516var
2617 x: longint;
2718 g: longint;
2819 m: set of (foo, bar);
2920
3021begin
3122 // yksi operaattori: negatiivinen etumerkki
3223 x := -42; // x saa arvokseen negatiivisen 42
3324
3425 // kaksi operaattoria: lukujen erotus
3526 g := 144 - 169; // g saa arvokseen negatiivisen 25
3627
3728 // kaksi operaattoria: joukkojen ero
3829 m := [foo, bar] - [bar]; // joukko m saa arvokseen joukon {foo}
3930end.
4031```
4132
4233## Toiminta lukujen kanssa
4334
4435Varoitus: Vähentämisen tulos (ja etumerkki muunnokset) pitäisi tehdä etumerkillisillä kokonaisluvuilla. Jos se ei ole, [[sRangechecks|{$rangechecks}]] on otettu käyttöön, se saattaa aiheuttaa ajon aikaisen virheen. Kaikissa muissa tapauksissa syntyy aritmeettisesti virheellinen tulos.
4536
4637``` pascal
4738program faultySubtraction(input, output, stderr);
4839
4940var
5041 x, y: longword;
5142
5243begin
5344 y := 1;
5445 {$push}
5546 {$rangechecks off} // otherwise the next expression
5647 x := 0 - y; // yields RTE 201
5748 {$pop}
5849
5950 writeLn(x);
6051end.
6152```
6253
6354Tämä ohjelma tulostaa `4294967295`, mikä on sama kuin `high(longword)` koska tapahtuu (etumerkittömän) kokonaisluvun ylivuoto.
6455
6556On kuitenkin tilanteista, joissa negatiiviset merkit eivät välttämättä aiheuta virheitä. Yritetään "negatiivisen" nollan tallentaminen ei vahingoita:
6657
6758``` pascal
6859program minusOperations(input, output, stderr);
6960
7061{$rangeChecks on}
7162
7263var
7364 n: longword;
7465
7566begin
7667 // "Negatiivinen" nolla
7768 n := 0;
7869 n := -n;
7970```
8071
8172Huomaa 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.
8273
8374``` pascal
8475 // välitulokset voivat olla alueen ulkopuolella:
8576 n := 1;
8677 n := n - n - n + 1;
8778end.
8879```
8980
9081Tämä koko ohjelma päättyy poistumiskoodilla [`exitCode`](https://www.freepascal.org/docs-html/rtl/system/exitcode.html) nolla (tämä tarkoittaa "onnistunutta" ohjelman lopettamista \[todellinen arvo saattaa vaihdella eri alustoilla\]).
9182
9283Tämän jälkimmäisen käyttäytymisen seurauksena: 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ää [[sOverflowchecks|{$overflowChecks}]] -toimintoa, joka herättää ajon aikaisen virheen.
9384
9485``` pascal
9586program overflowChecksDemo(input, output, stderr);
9687
9788{$overflowChecks on}
9889
9990var
10091 n: {$ifdef CPU64} int64 {$else} longint {$endif};
10192
10293begin
10394 n := high(n);
10495 n := n + 1; // Aiheuttaa ajonaikaisen virheen (RTE) 215
10596end.
10697```
10798
10899Kää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:
109100
110101``` pascal
111102program overflowAnticipation(input, output, stderr);
112103
113104var
114105 n: {$ifdef CPU64} int64 {$else} longint {$endif};
115106
116107begin
117108 // untreated
118109 n := high(n);
119110 n := n + 1;
120111 writeLn(n); // prints low(n)
121112
122113 // anticipated: reverse operation and comparison w/ 1st operand
123114 n := high(n);
124115 if high(n) - 1 < n then
125116 begin
126117 halt(1);
127118 end;
128119 n := n + 1;
129120 writeLn(n);
130121end.
131122```
132123
133124Tämä ei tietenkään ole yhtä tehokasta kuin ylivuotorekisterin testaaminen, ja täällä, ilman uudelleenkäytettyä [[Constant/fi|vakiota (constant)]], on jopa alttiita ohjelmointivirheille (harkitse tilannetta, joka muuttaa vain yhden summan).
134125
135126---
136127*From the Free Pascal wiki, page "Minus/fi", as it stood on 2022-08-06 after a change by Kai Burghardt, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history