ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
siro
Beiträge: 761
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von siro »

Hallo zusammen, ein eigentlich triviales Problemchen,
fast schon zu peinlich um überhaupt zu fragen :P , aber ich tue dies totzdem, da ich grade in einer ähnlichen Form darüber gestoplert bin.
Der verkürzte Code, worum es geht:

Code: Alles auswählen

program Project1;

var a,b:Byte;

begin
  a:=50;
  b:=250;
  if      a-b  < 10 then Writeln('ja') else Writeln('nein');   // es wird ja   ausgegeben
  if Byte(a-b) < 10 then Writeln('ja') else Writeln('nein');   // es wird nein ausgegeben
  Writeln(a-b);                                                // -200
  Writeln(Byte(a-b));                                          // 56
  ReadLn;
end.
a und b sind ja jeweils ein Byte, also 8 Bit ohne Vorzeichen.
Wenn ich von 50 den Wert 250 abziehe, gibt es natürlich einen Unterlauf.
Das Ergebnis müsste 56 sein.
Dies trifft jedoch nur zu, wenn ich einen expliziten "Byte Typecast" mache, obwohl es ja schon Bytes sind.
Ist das Ergebnis der Subtraktion automatisch ein Integer ?
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10897
Registriert: Mo 11. Sep 2006, 19:01

Re: ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von theo »

Ich glaube, das steht hier: https://www.freepascal.org/docs-html/cu ... 26-26003r2
If both operands have the same signedness, the result is the same type as them. The only exception is subtracting (-): in the case of unsigned - unsigned subtracting produces a signed result in FPC (as in Delphi, but not in TP7).

siro
Beiträge: 761
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von siro »

Super, danke Dir Theo, das wusste ich nicht.
Damit hast Du mein Nichtwissen aufgebessert und die Frage komplett beantwortet.
Einen schönen Sonntag noch allen.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Benutzeravatar
theo
Beiträge: 10897
Registriert: Mo 11. Sep 2006, 19:01

Re: ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von theo »

Naja, das ist wohl leider nicht die ganze Wahrheit.

Code: Alles auswählen

var a,b:Byte;
begin
a:=200;
b:=100;
Writeln(a+b);
Das gibt auch 300 und nicht etwas im Byte-Bereich.
Im Hinterkopf hatte ich das schon, aber ich könnte jetzt nicht sagen, wo dieses Verhalten genau beschrieben ist.

Vielleicht hat PascalDragon das auf dem Schirm?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6815
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von af0815 »

theo hat geschrieben: So 11. Mai 2025, 14:43 Das gibt auch 300 und nicht etwas im Byte-Bereich.
Im Hinterkopf hatte ich das schon, aber ich könnte jetzt nicht sagen, wo dieses Verhalten genau beschrieben ist.
Bei writeln würde ich aufpassen, das dort nicht eine Erweiterung des Typs aufgrund des Überlaufes vorgenommen wird.

Code: Alles auswählen

var a,b,c:Byte;
begin
  a:=200;
  b:=100;
  c:= a+b;
  Writeln(c);  
 end; 
  
hier ist c gleich 44 bei mir.

Code: Alles auswählen

var a,b,c:Byte;
begin
  a:=50;
  b:=250;
  c:= a-b;
  Writeln(c); 
 end;
 
hier ist c gleich 56

aktiviere ich den Rangecheck, dann kracht es selbstverständlich mit einem RunError(201).
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 958
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: ist das Ergebnis einer Subtraktion von 2 Bytes automatsich ein Integer ?

Beitrag von PascalDragon »

theo hat geschrieben: So 11. Mai 2025, 14:43 Naja, das ist wohl leider nicht die ganze Wahrheit.

Code: Alles auswählen

var a,b:Byte;
begin
a:=200;
b:=100;
Writeln(a+b);
Das gibt auch 300 und nicht etwas im Byte-Bereich.
Im Hinterkopf hatte ich das schon, aber ich könnte jetzt nicht sagen, wo dieses Verhalten genau beschrieben ist.
Ausdrücke werden standardmäßig in der nativen Weite berechnet und wenn nötig wieder (mit Bereichsprüfung falls aktiviert - siehe af0815's Kommentar) runterreduziert.
FPC Compiler Entwickler

Antworten