Code: Alles auswählen
program Project1;
var c, l, h : integer;
begin
l := 2;
h := 1;
c := l + ((h-l) shr 1);
end.
Kann mal jemand meinen Fuß von der Leitung nehmen bitte.
Code: Alles auswählen
program Project1;
var c, l, h : integer;
begin
l := 2;
h := 1;
c := l + ((h-l) shr 1);
end.
Yepp. Bekomme einen Range-Checkfliegermichl hat geschrieben: Mi 11. Nov 2026, 12:05Der Code kommt In einer Quicksortroutine zum Einsatz und erzeugt einen arithmetischen Überlauf. Ich verstehe aber nicht weshalb?Code: Alles auswählen
program Project1; var c, l, h : integer; begin l := 2; h := 1; c := l + ((h-l) shr 1); end.
Kann mal jemand meinen Fuß von der Leitung nehmen bitte.
Code: Alles auswählen
+
program Project1;
{$mode ObjFPC}{$H+}
var l, h : Int64;
c,t:Int64;
begin
l := 2;
h := 1;
t:=(h-l) shr 1;
Writeln('t=',t);
c := l + t;
writeln('c=',c);
Readln;
end.Auf Deutsch: Undefiniertes Verhalten, falls rechts vom shr mehr oder gleich viele Bits stehen, wie links verschoben werden sollen.The result is undefined if the right operand of a shift expression is negative or if the right operand is greater than or equal to the number of bits in the (promoted) left operand.
x shr 1 ist halt sehr schnellfliegermichl hat geschrieben: Mi 11. Nov 2026, 14:28 Danke. Ich denke auch, daß es durch das stumpfe rechts shiften von links her mit 0 aufgefüllt wird und dadurch ein sehr großer Integer Wert entsteht (MaxInt) und zu dem 2 hinzuaddiert sprengt dann den Rahmen.
Ich hab es jetzt auf div 2 umgestellt und dann klappt es.
Code: Alles auswählen
program Project1;
var c, l, h : integer;
begin
l := 2;
h := 1;
If (h-l)>1 Then
c := l + ((h-l) shr 1)
Else
c := l + ((h-l) div 2);
end.