Minus/fi

From Free Pascal wiki
Revision as of 11:01, 29 April 2018 by Djzepi (talk | contribs) (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> [...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

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)