Sign in Join
Wiki copytemporary

Minus/fi: what changed

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

Title: Minus/fi

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+
3+\-
4+
5+</div>
6+
7+[[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+\
13+
14+## Esiintyminen
15+
16+Symboli `-` (jota sanotaan “miinusmerkiksi”) käytetään
17+
18+- ilmaisemaan että luku on negatiivinen
19+- vähentämään kaksi lukua
20+- muodostavat kahden [[Set/fi|joukon]] erotuksen
21+
22+``` pascal
23+program minusDemo(input, output, stderr);
24+
25+var
26+ x: longint;
27+ g: longint;
28+ m: set of (foo, bar);
29+
30+begin
31+ // yksi operaattori: negatiivinen etumerkki
32+ x := -42; // x saa arvokseen negatiivisen 42
33+
34+ // kaksi operaattoria: lukujen erotus
35+ g := 144 - 169; // g saa arvokseen negatiivisen 25
36+
37+ // kaksi operaattoria: joukkojen ero
38+ m := [foo, bar] - [bar]; // joukko m saa arvokseen joukon {foo}
39+end.
40+```
41+
42+## Toiminta lukujen kanssa
43+
44+Varoitus: 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.
45+
46+``` pascal
47+program faultySubtraction(input, output, stderr);
48+
49+var
50+ x, y: longword;
51+
52+begin
53+ y := 1;
54+ {$push}
55+ {$rangechecks off} // otherwise the next expression
56+ x := 0 - y; // yields RTE 201
57+ {$pop}
58+
59+ writeLn(x);
60+end.
61+```
62+
63+Tämä ohjelma tulostaa `4294967295`, mikä on sama kuin `high(longword)` koska tapahtuu (etumerkittömän) kokonaisluvun ylivuoto.
64+
65+On kuitenkin tilanteista, joissa negatiiviset merkit eivät välttämättä aiheuta virheitä. Yritetään "negatiivisen" nollan tallentaminen ei vahingoita:
66+
67+``` pascal
68+program minusOperations(input, output, stderr);
69+
70+{$rangeChecks on}
71+
72+var
73+ n: longword;
74+
75+begin
76+ // "Negatiivinen" nolla
77+ n := 0;
78+ n := -n;
79+```
80+
81+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.
82+
83+``` pascal
84+ // välitulokset voivat olla alueen ulkopuolella:
85+ n := 1;
86+ n := n - n - n + 1;
87+end.
88+```
89+
90+Tä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\]).
91+
92+Tä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.
93+
94+``` pascal
95+program overflowChecksDemo(input, output, stderr);
96+
97+{$overflowChecks on}
98+
99+var
100+ n: {$ifdef CPU64} int64 {$else} longint {$endif};
101+
102+begin
103+ n := high(n);
104+ n := n + 1; // Aiheuttaa ajonaikaisen virheen (RTE) 215
105+end.
106+```
107+
108+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:
109+
110+``` pascal
111+program overflowAnticipation(input, output, stderr);
112+
113+var
114+ n: {$ifdef CPU64} int64 {$else} longint {$endif};
115+
116+begin
117+ // untreated
118+ n := high(n);
119+ n := n + 1;
120+ writeLn(n); // prints low(n)
121+
122+ // anticipated: reverse operation and comparison w/ 1st operand
123+ n := high(n);
124+ if high(n) - 1 < n then
125+ begin
126+ halt(1);
127+ end;
128+ n := n + 1;
129+ writeLn(n);
130+end.
131+```
132+
133+Tä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).
134+
135+---
136+*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