Minus/fi

From Free Pascal wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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)