Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 96

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

НСмного ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ вычитания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Dec (листинг 3.5, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Overflow2 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.5. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π΅

{$R+}

procedure TForm1.Button1Click(Sender: TObject);

var X: Byte;

begin

 X := 0;

 Dec(X);

 Label1.Caption := IntToStr(X);

end;

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Ρ‚ΠΎΡ‚ ΠΆΠ΅ (X ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 255), Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: нСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ опция Range checking Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚. Π­Ρ‚ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Overflow2 отличаСтся ΠΎΡ‚ Overflow1 β€” Ρ‚Π°ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚. Бвязано это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ использовании Dec ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ контролируСтся Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ β€” Overflow checking (Π² ΠΊΠΎΠ΄Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ {$Q+} ΠΈΠ»ΠΈ {$OVERFLOWCHECKS ON}). Π­Ρ‚Π° опция ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΈ Π΅Π΅ Ρ‚Π°ΠΊΠΆΠ΅ рСкомСндуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅. ΠŸΡ€ΠΈ Π΅Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ EIntOverflow.

3.1.4. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ числа

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ попытаСмся ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ число (листинг 3.6, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Compare1 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.6. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ "ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ…" Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ числа

procedure TForm1.Button1Click(Sender: TObject);

var

 X: Byte;

 Y: ShortInt;

begin

 Y := -1;

 X := Y;

 if X = Y then Label1.Caption := 'Π Π°Π²Π½ΠΎ';

 else Label1.Caption := 'He Ρ€Π°Π²Π½ΠΎ';

end;

Π’ ΠΎΠΊΠ½Π΅ появится надпись НС Ρ€Π°Π²Π½ΠΎ, хотя ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±ΠΈΡ‚ΠΎΠ² Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… X ΠΈ Y Π±ΡƒΠ΄Π΅Ρ‚, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, одинаковая. Надпись соотвСтствуСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” X (255) Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ Ρ€Π°Π²Π½ΠΎ Y (-1). РазбСрСмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ происходит.

Π’Π΅, ΠΊΡ‚ΠΎ успСл ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Compare1, ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ компилятора Π½Π° строкС со сравнСниСм: "Comparing signed and unsigned types β€” widened both operands". Π­Ρ‚ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ всС ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚: компилятор, зная, Ρ‡Ρ‚ΠΎ совпадСниС Π½Π°Π±ΠΎΡ€ΠΎΠ² Π±ΠΈΡ‚ΠΎΠ² Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ равСнство Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ выраТСния, сначала "Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚" Ρ‚ΠΈΠΏΡ‹ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Ρ‡Π΅ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π²ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΎΠ±Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΈ лишь Π·Π°Ρ‚Π΅ΠΌ выполняСт сравнСниС. Π­Ρ‚ΠΎ обСспСчиваСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов, поэтому компилятор Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.

АналогичныС дСйствия компилятор Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΏΡ€ΠΈ сравнСнии Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠΎΠ² Word ΠΈ SmallInt, Π° Ρ‚Π°ΠΊΠΆΠ΅ LongInt ΠΈ LongWord. Π’ΠΈΠΏ Int64 Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΎΠ³Π°, поэтому ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹ этого Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΈ сравнСнии компилятор Π½Π΅ "Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚".

Π―Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² позволяСт ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ Ρ‚ΠΈΠΏΠ° ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΠΎΠ±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ сравнСниСм (листинг 3.7. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Compare2 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.7. Π―Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€ΠΈ сравнСнии

procedure TForm1.Button1Click(Sender: TObject);

var

 X: Byte;

 Y: ShortInt;

begin

 Y := -1;

 X := Y;

 if X = Byte(Y) then Label1.Caption := 'Π Π°Π²Π½ΠΎ'

 else Label1.Caption := 'НС Ρ€Π°Π²Π½ΠΎ';

end;

ΠŸΡ€ΠΈ компиляции Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π΅ выдаСтся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, Π½ΠΎ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ сравнСния Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²Π΅Ρ€Π½Ρ‹ΠΌ: Π Π°Π²Π½ΠΎ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ >, <, >= ΠΈ <= Ρ‚ΠΎΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ для Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… чисСл. ΠŸΡƒΡΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΡ€Π°Π²Π½ΠΈΠ²Π°ΡŽΡ‚ΡΡ числа 01000000 ΠΈ 11000000. Π’ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ это 64 ΠΈ 192, поэтому ΠΏΠ΅Ρ€Π²ΠΎΠ΅ число мСньшС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ. А Π² Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌ это 64 ΠΈ -64, Ρ‚. Π΅. ΠΏΠ΅Ρ€Π²ΠΎΠ΅ число большС. Из-Π·Π° этого для ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сравнСния для Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… чисСл Π² систСмС ΠΊΠΎΠΌΠ°Π½Π΄ процСссора ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½ΡƒΡ‚ΡŒ это, часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ названия ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² зависимости ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°: для Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… чисСл β€” "большС" ΠΈ "мСньшС", для Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… β€” "Π²Ρ‹ΡˆΠ΅" ΠΈ "Π½ΠΈΠΆΠ΅".

3.1.5. НСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ†ΠΈΠΊΠ»Π΅ for

Рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ForRange Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС), Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ находятся ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΈ панСль, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠ° (это Π²Π°ΠΆΠ½ΠΎ!) β€” Π½Π΅ Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ, Π° Π½Π° Ρ„ΠΎΡ€ΠΌΠ΅, Π° Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ (листинг 3.8).

Листинг 3.8. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ

procedure TForm1.Button1Click(Sender: TObject);

var

 I: Cardinal;

begin

 for I := 0 to Panel1.ControlCount - 1 do

  Panel1.Controls[I].Tag := 1;

end;

На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ, Ρ‚.ΠΊ. Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π΅Ρ‚, ΠΈ Ρ†ΠΈΠΊΠ» for Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ Π½ΠΈ Ρ€Π°Π·Ρƒ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Access violation.

ΠŸΡ€ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΌ количСствС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Panel1.ControlCount - 1 Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π΄Π°Π²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСмСнная Ρ†ΠΈΠΊΠ»Π° ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Π‘ardinal, эта комбинация Π±ΠΈΡ‚ΠΎΠ² интСрпрСтируСтся ΠΊΠ°ΠΊ 4 294 967 295, вСрхняя Π³Ρ€Π°Π½ΠΈΡ†Π° оказываСтся большС Π½ΠΈΠΆΠ½Π΅ΠΉ, ΠΈ Ρ†ΠΈΠΊΠ» Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ, ΠΎΠ±Ρ€Π°Ρ‰Π°ΡΡΡŒ ΠΊ Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ элСмСнтам управлСния. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ ошибка.

Ошибка исчСзнСт, Ссли Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ I ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Integer β€” Π² этом случаС вСрхняя Π³Ρ€Π°Π½ΠΈΡ†Π° Ρ†ΠΈΠΊΠ»Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1, ΠΈ Ρ†ΠΈΠΊΠ» Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ выполнится Π½ΠΈ Ρ€Π°Π·Ρƒ. Если Π½Π° ΠΏΠ°Π½Π΅Π»ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ошибки Ρ‚ΠΎΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ вСрхняя Π³Ρ€Π°Π½ΠΈΡ†Π° Ρ†ΠΈΠΊΠ»Π° Π½Π΅ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Π½Π΅ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… чисСл.

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π² ситуации, ΠΊΠΎΠ³Π΄Π° использованиС Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° каТСтся Π²ΠΏΠΎΠ»Π½Π΅ Π±Π΅Π·ΠΎΠ±ΠΈΠ΄Π½Ρ‹ΠΌ (Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, индСксы списка Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ), нас подстСрСгаСт "ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΉ камСнь", связанный с Ρ‚Π΅ΠΌ. Ρ‡Ρ‚ΠΎ вСрхняя Π³Ρ€Π°Π½ΠΈΡ†Π° Ρ†ΠΈΠΊΠ»Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ нСявно ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° ΠΊ Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ числу. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Ρ†ΠΈΠΊΠ»Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ пСрСмСнная Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Integer, Π° Ссли ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° Cardinal, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ значСния ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ‚ΠΈΠΏΠ°.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΈ со Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, Ссли Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ Ρ†ΠΈΠΊΠ»Π° for пСрСходят допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ этих чисСл, просто Ρ†ΠΈΠΊΠ»Ρ‹, пСрСмСнная ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ значСния Π²Π±Π»ΠΈΠ·ΠΈ Π³Ρ€Π°Π½ΠΈΡ† Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° Ρ‚ΠΈΠΏΠ° Integer, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Ρ€Π΅ΠΆΠ΅.

3.2. НСочСвидныС особСнности вСщСствСнных чисСл

Если рассмотрСнныС Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… особСнности Ρ†Π΅Π»Ρ‹Ρ… чисСл ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌ, Ρ‚ΠΎ вСщСствСнныС числа ΠΌΠΎΠ³ΡƒΡ‚ прСподнСсти ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Ρ‹ Π΄Π°ΠΆΠ΅ достаточно ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ программистам, Ρ‚.ΠΊ. ΠΈΡ… ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ сущСствСнно дальшС ΠΎΡ‚ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹Ρ… прСдставлСний, ΠΈ эти нСоТиданности Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ Ρ‚Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Π° ΠΏΠΎ Delphi, Π² основном, считаСт этот вопрос нСсущСствСнным ΠΈ ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΡ‚ Π΅Π³ΠΎ стороной, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ программист, Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΠΉΡΡ с ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… ΡΡŽΡ€ΠΏΡ€ΠΈΠ·ΠΎΠ², Π²ΠΏΠ°Π΄Π°Π΅Ρ‚ Π² Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π½ΠΈΠ΅ ΠΈ испытываСт ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ "ΠΏΠΎΠΏΡ€Ρ‹Π³Π°Ρ‚ΡŒ Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° с Π±ΡƒΠ±Π½ΠΎΠΌ". Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ попытаСмся Π²ΠΎΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±ΡŠΡΡΠ½ΠΈΠΌΡ‹Π΅ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд явлСния Π½Π° самом Π΄Π΅Π»Π΅ просты ΠΈ прСдсказуСмы, Ссли извСстно, ΠΊΠ°ΠΊ рСализуСтся вСщСствСнная Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠ° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ.

3.2.1. Π”Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Ρ€ΠΎΠ±ΠΈ

Для Π½Π°Ρ‡Π°Π»Π° β€” Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π’ школС ΠΌΡ‹ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠΌ Π΄Π²Π° Π²ΠΈΠ΄Π° Π΄Ρ€ΠΎΠ±Π΅ΠΉ простыС ΠΈ дСсятичныС. ДСсятичныС Π΄Ρ€ΠΎΠ±ΠΈ, ΠΏΠΎ сути Π΄Π΅Π»Π°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Ρ€Π°Π·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ числа ΠΏΠΎ стСпСням дСсяти. Π’Π°ΠΊ, запись 13,6704 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ число, Ρ€Π°Π²Π½ΠΎΠ΅ 1Ξ‡101 + 3Ξ‡100 + 6Ξ‡10-1 + 7Ξ‡10-2 + 0Ξ‡10-3 + 4Ξ‡10-4. Но Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС всСх чисСл Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅, Π² Ρ‚ΠΎΠΌ числС ΠΈ вСщСствСнных, Π½Π΅ дСсятичноС, Π° Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠ΅. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Ρ€ΠΎΠ±ΠΈ. Они Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆΠΈ Π½Π° дСсятичныС, Π½ΠΎ основаниСм стСпСни Ρƒ Π½ΠΈΡ… слуТит Π΄Π²ΠΎΠΉΠΊΠ°. Π’Π°ΠΊ, двоичная Π΄Ρ€ΠΎΠ±ΡŒ 101.1101 β€” это 1Ξ‡22 + 0Ξ‡21 + 1Ξ‡20 + 1Ξ‡2-1 + 1Ξ‡2-2 + 0Ξ‡2-3 + 1Ξ‡2-4. Π’ дСсятичном прСдставлСнии это число Ρ€Π°Π²Π½ΠΎ 5,8125, Π² Ρ‡Π΅ΠΌ Π½Π΅Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ любого ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вспомним Π½Π°ΡƒΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ записи дСсятичного числа. ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π² этой записи ΠΈΠ΄Π΅Ρ‚ Π·Π½Π°ΠΊ числа (плюс ΠΈΠ»ΠΈ минус). Π”Π°Π»ΡŒΡˆΠ΅ ΠΈΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊ называСмая мантисса (число ΠΎΡ‚ 1 Π΄ΠΎ 10). Π—Π°Ρ‚Π΅ΠΌ ΠΈΠ΄Π΅Ρ‚ экспонСнта (ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ дСсяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ мантиссу, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎΠ΅ число). Π˜Ρ‚Π°ΠΊ, ΡƒΠΆΠ΅ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π²ΡˆΠ΅Π΅ΡΡ число 13,6704 Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² этом Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΊΠ°ΠΊ 1.36704Ξ‡101 (ΠΈΠ»ΠΈ 1.36704E1 ΠΏΠΎ принятым Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ). Если записываСмоС число мСньшС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹, экспонСнта Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ. Аналогичная запись сущСствуСт ΠΈ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ систСмС. Π’Π°ΠΊ, 101.1101 Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ 1.011101*1010 (Π²Π΅Π·Π΄Π΅ использована двоичная Ρ„ΠΎΡ€ΠΌΠ° записи, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ 1010 ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ 22). ИмСнно Ρ‚Π°ΠΊΠΎΠ΅ прСдставлСниС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ Π² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅. Двоичная Ρ‚ΠΎΡ‡ΠΊΠ° Π² Ρ‚Π°ΠΊΠΎΠΉ записи Π½Π΅ остаСтся Π½Π° ΠΎΠ΄Π½ΠΎΠΌ мСстС, Π° сдвигаСтся Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ Π² экспонСнтС, поэтому Ρ‚Π°ΠΊΠΈΠ΅ числа Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ числами с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ (floating point numbers).