Difference between revisions of "Minus/fi"

From Lazarus wiki
Jump to navigationJump to search
(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" enclose="none">45</syntaxhighlight>  
+
[[ASCII/fi|ASCII]]:ssa joka on merkistön koodina desimaalisena <syntaxhighlight lang="pascal" inline>45</syntaxhighlight>  
(tai [[Hexadecimal/fi|heksadesimaalisena]] <syntaxhighlight lang="pascal" enclose="none">2D</syntaxhighlight>) on määritelty  
+
(tai [[Hexadecimal/fi|heksadesimaalisena]] <syntaxhighlight lang="pascal" inline>2D</syntaxhighlight>) on määritelty  
<syntaxhighlight lang="pascal" enclose="none">-</syntaxhighlight> (miinusmerkiksi).
+
<syntaxhighlight lang="pascal" inline>-</syntaxhighlight> (miinusmerkiksi).
  
 
<br> <br><br> <br>
 
<br> <br><br> <br>
Line 11: Line 11:
 
== Esiintyminen ==
 
== Esiintyminen ==
  
Symboli <syntaxhighlight lang="pascal" enclose="none">-</syntaxhighlight> (jota sanotaan “miinusmerkiksi”) käytetään
+
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" enclose="none">{$rangechecks}</syntaxhighlight>]] on otettu käyttöön, se saattaa aiheuttaa ajon aikaisen virheen.  
+
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" enclose="none">4294967295</syntaxhighlight>, mikä on sama kuin <syntaxhighlight lang="pascal" enclose="none">high(longword)</syntaxhighlight> koska tapahtuu (etumerkittömän) kokonaisluvun ylivuoto.
+
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" enclose="none">{$rangechecks on}</syntaxhighlight> tuottaman koodin ansiosta tyypin rajat eivät ylity tuloksen tallentamisen jälkeen.
+
<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" enclose="none">exitCode</syntaxhighlight>}}  
+
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" enclose="none">{$overflowChecks}</syntaxhighlight>]]
+
[[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" enclose="none">{$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:
+
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).


navigation bar: topic: Pascal symbols
single characters

+ (plus)  •  - (minus)  •  * (asterisk)  •  / (slash)
= (equal)  •  > (greater than)  •  < (less than)
. (period)  •  : (colon)  •  ; (semi colon)
^ (hat)  •  @ (at)
$ (dollar sign)  •  & (ampersand)  •  # (hash)
' (single quote)

character pairs

<> (not equal)  •  <= (less than or equal)  •  := (becomes)  •  >= (greater than or equal)

 •  >< (symmetric difference)  •  // (double slash)