Minus/fi

From Free Pascal wiki

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:

 1 program minusOperations(input, output, stderr);
 2 
 3 {$rangeChecks on}
 4 
 5 var
 6 	n: longword;
 7 
 8 begin
 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;
16 end.

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.


 1 program overflowChecksDemo(input, output, stderr);
 2 
 3 {$overflowChecks on}
 4 
 5 var
 6 	n: {$ifdef CPU64} int64 {$else} longint {$endif};
 7 
 8 begin
 9 	n := high(n);
10 	n := n + 1;   // Aiheuttaa ajonaikaisen virheen (RTE) 215
11 end.

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:


 1 program overflowAnticipation(input, output, stderr);
 2 
 3 var
 4 	n: {$ifdef CPU64} int64 {$else} longint {$endif};
 5 
 6 begin
 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);
20 end.

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)

character pairs

<> (not equal)  •  := (becomes)  •  >< (symmetric difference)  •  // (double slash)