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

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

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

Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ дСйствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… допустимого Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Рассмотрим, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚, Ссли ΠΌΡ‹ Π²Ρ‹ΠΉΠ΄Π΅ΠΌ Π·Π° Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹. ΠŸΡƒΡΡ‚ΡŒ Π² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ записи Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ· 130 Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ 10. 130 β€” это 10000010, послС вычитания ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 01111000 (120). Но Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эти Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ значСния ΠΊΠ°ΠΊ Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ числа, получится, Ρ‡Ρ‚ΠΎ ΠΈΠ· -126 ΠΌΡ‹ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌ 10 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 120. Π’Π°ΠΊΠΈΠΌΠΈ ΠΏΠ°Ρ€Π°Π΄ΠΎΠΊΡΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ приходится Ρ€Π°ΡΠΏΠ»Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π·Π° ΡƒΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ со Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ числами.

Рассмотрим Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€: ΠΈΠ· пяти (Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΌ прСдставлСнии 00000101) Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ Π΄Π΅ΡΡΡ‚ΡŒ (00001010). Π—Π΄Π΅ΡΡŒ умСстно Π²ΡΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ Π² столбик, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ изучаСтся Π² школС: Ссли Π² разрядС ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌΠΎΠ³ΠΎ стоит Ρ†ΠΈΡ„Ρ€Π°, большая, Ρ‡Π΅ΠΌ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ разрядС Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΈΠ· ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ разряда ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌΠΎΠ³ΠΎ приходится Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Π’ΠΎ ΠΆΠ΅ самоС ΠΈ здСсь: Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ большСС число ΠΈΠ· мСньшСго, ΠΊΠ°ΠΊ Π±Ρ‹ занимаСтся Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΈΠ· Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ дСвятого разряда. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊ: ΠΈΠ· числа (1)00000101 вычитаСтся (0)00001010 ΠΈ получаСтся (0)11111011 (Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ дСвятый разряд ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² скобках: послС получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΡ‹ ΠΏΡ€ΠΎ Π½Π΅Π³ΠΎ снова Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ). Если ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΊΠ°ΠΊ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅, Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π²Π΅Π½ -5, Ρ‚.Π΅. ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ. Но с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ получаСтся, Ρ‡Ρ‚ΠΎ 5-10=251.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ дСмонстрировали ситуации, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ укладывался Π² ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² (Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΈΠ»ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ), Π½ΠΎ Π½Π΅ укладывался Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Рассмотрим, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚, Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π½ΠΈ Π² Ρ‚ΠΎΡ‚, Π½ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. ΠŸΡƒΡΡ‚ΡŒ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ 10000000 ΠΈ 10000000. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΌ слоТСнии снова появляСтся Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ дСвятый разряд, Π½ΠΎ Π½Π° этот Ρ€Π°Π· ΠΈΠ· Π½Π΅Π³ΠΎ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° Π½Π΅ занимаСтся, Π° Π² Π½Π΅Π³ΠΎ пСрСносится лишняя. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ (1)00000000. ΠΠ΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ разряд ΠΏΠΎΡ‚ΠΎΠΌ игнорируСтся. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΠΈ получаСтся, Ρ‡Ρ‚ΠΎ 128 + 128 = 0. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΉ β€” Ρ‡Ρ‚ΠΎ -128 + (-128) = 0, Ρ‚.Π΅. ΠΎΠ±Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°, ΠΊΠ°ΠΊ ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ с самого Π½Π°Ρ‡Π°Π»Π°, ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ.

Π—Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ†Π΅Π»Ρ‹Π΅ прСдставлСны Π² Delphi Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ShortInt (N=8, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -128..127), SmallInt (N=16, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -32 768..32 767), LongInt (N=32, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -2 147 483 648..2 147 483 647) ΠΈ Int64 (N=64, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ -9 223 372 036 854 775 808..9 223 372 036 854 775 807).

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

32-разрядныС процСссоры Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ нСпосрСдствСнно с 64-разрядными числами, поэтому компилятор Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ это число ΠΏΠΎ частям. Π‘Π½Π°Ρ‡Π°Π»Π° опСрация слоТСния ΠΈΠ»ΠΈ вычитания выполняСтся Π½Π°Π΄ младшими 32-мя разрядами Π° ΠΏΠΎΡ‚ΠΎΠΌ β€” Π½Π°Π΄ ΡΡ‚Π°Ρ€ΡˆΠΈΠΌΠΈ 32-мя, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ, Ссли Π² ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ занималась Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΈΠ· Π½Π΅ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ (Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ) 33-Π³ΠΎ разряда ΠΈΠ»ΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ†Π° ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠ»Π°ΡΡŒ Π² Π½Π΅Π³ΠΎ, ΠΏΡ€ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ эта Π΅Π΄ΠΈΠ½ΠΈΡ†Π° учитываСтся.

Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… сказанноС.

3.1.2. Π’Ρ‹Ρ…ΠΎΠ΄ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΡ€ΠΈ присваивании

НачнСм с рассмотрСния простого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° (листинг 3.1. ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Assignment1 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.1. НСявноС ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ числа Π² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΈ присваивании

procedure TForm1.Button1Click(Sender: TObject);

var

 X: Byte;

 Y: ShortInt;

begin

 Y := -1;

 X := Y;

 Label1.Caption := IntToStr(X);

end;

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 255. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ сталкиваСмся с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ всС разряды значСния Y Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² X, Π½ΠΎ Ссли Y интСрпрСтируСтся ΠΊΠ°ΠΊ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ число, Ρ‚ΠΎ X β€” ΠΊΠ°ΠΊ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅, Π° числам 255 ΠΈ -1 Π² Π²ΠΎΡΡŒΠΌΠΈΡ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΠΌ прСдставлСнии соотвСтствуСт ΠΎΠ΄Π½Π° ΠΈ Ρ‚Π° ΠΆΠ΅ комбинация Π±ΠΈΡ‚ΠΎΠ².

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

ΠŸΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Π°Ρ пСрСмСнная Y понадобилась ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ прямо ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, выходящСС Π·Π° Π΅Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½, компилятор Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ β€” Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ошибка компиляции "Constant expression violates subrange bounds".

Π‘Ρ‚Ρ€ΠΎΠ³ΠΎ говоря, Π² Delphi прСдусмотрСна Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ присваивания. Если Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ Range checking (Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΎΠΊΠ½Π΅ Project/Options... Π½Π° Π·Π°ΠΊΠ»Π°Π΄ΠΊΠ΅ Compiler ΠΈΠ»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ компилятора {$R+} ΠΈΠ»ΠΈ {$RANGECHECKS ON}), Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ присвоСния X := Y Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ERangeError. Но ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ эта опция ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π° (для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ β€” Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ), поэтому ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±Π΅Π· сообщСний ΠΎΠ± ошибкС выполняСт Ρ‚Π°ΠΊΠΎΠ΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ присваиваниС.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ (листинг 3.2, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Assignment2 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС) ΠΌΡ‹ рассмотрим присваиваниС числу Ρ‚Π°ΠΊΠΎΠ³ΠΎ значСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ укладываСтся Π½ΠΈ Π² Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ, Π½ΠΈ Π² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹ΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.

Листинг 3.2. ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ значСния, выходящСго Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°

procedure TForm1.Button1Click(Sender: TObject);

var

 X: Byte;

 Y: Word;

begin

 Y := 1618;

 X := Y;

 Label1.Caption := IntToStr(X)

end;

На экранС появится число 82. РазбСрСмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это происходит. Число 1618 Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ записи Ρ€Π°Π²Π½ΠΎ 00000110 01010010. ΠŸΡ€ΠΈ присваивании этого значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ X ΡΡ‚Π°Ρ€ΡˆΠΈΠ΅ восСмь Π±ΠΈΡ‚ΠΎΠ² "Π½Π΅ΠΊΡƒΠ΄Π° Π΄Π΅Π²Π°Ρ‚ΡŒ", поэтому ΠΎΠ½ΠΈ просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π² Π₯ записываСтся число 01010010, Ρ‚.Π΅. 82.

РазумССтся, ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Range checking ΠΈ Π² этом случаС ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ERangeError.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π΄Π²Π° основных источника нСоТиданностСй, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈ присваивании значСния Ρ†Π΅Π»ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ:

1. ΠŸΡ€ΠΈ смСшСнии Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Ρ… чисСл Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ мСняСтся ΠΈΠ·-Π·Π° Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±ΠΈΡ‚ интСрпрСтируСтся Ρ‚ΠΎ ΠΊΠ°ΠΊ Π·Π½Π°ΠΊ числа, Ρ‚ΠΎ ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ разряд. 

2. ΠŸΡ€ΠΈ присваивании ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ значСния, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π΅Π³ΠΎ большСго числа разрядов, "лишниС" разряды просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

ВсС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ ΠΏΡ€ΠΈ присваивании сводятся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· этих случаСв ΠΈΠ»ΠΈ ΠΊ ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ.

ВсС эти ситуации ΠΏΡ€ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Range checking приводят ΠΊ ошибкам, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ. Из-Π·Π° этого рСкомСндуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ эту ΠΎΠΏΡ†ΠΈΡŽ хотя Π±Ρ‹ Π½Π° этапС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ.

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ присваивания Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, выходящих Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ "Ρ…ΠΈΡ‚Ρ€Ρ‹Ρ…" Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ сопряТСнии сторонних Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹, другая β€” Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²Ρ‹Π΅). Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ERangeError Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΎ, слСдуСт ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ явноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ Range checking (листинг 3.3).

Листинг 3.3. Π―Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° для подавлСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ

procedure TForm1.Button1Click(Sender: TObject);

var

 X: Byte;

 Y: ShortInt;

begin

 Y := -1;

 X := Byte(Y);

 Label1.Caption := IntToStr(X)

end;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΅Π³ΠΎ выполнСния пСрСмСнная X ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 255.

3.1.3. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ арифмСтичСских опСрациях

ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ принято Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° ΠΏΡ€ΠΈ опСрациях Π½Π°Π΄ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ Π΅Π΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (листинг 3.4, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Overflow1 Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.4. ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ

procedure TForm1.Button1Click(Sender: TObject);

var X: Byte;

begin

 X := 0;

 X := X - 1;

 Label1.Caption := IntToStr(X)

end;

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ X ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 255, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠΈ получаСтся -1, Ρ‡Ρ‚ΠΎ Π² Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ соотвСтствуСт 255. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅, этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ практичСски эквивалСнтСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Assignment1, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ -1 появляСтся Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

НСмного ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” Π·Π°ΠΌΠ΅Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ вычитания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ 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. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΠΈ Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ числа