There is no confusion for people who remember 16-bit TuboPascal and Delphi 1.x - those did not have LongStrings, and did not needed them very much indeed.
Basically it is the same history that makes LongString (as those types of string are together called in Delphi RTL internals) first letter by s[1] while dynarrays start with a[0]
Actually it was AnsiString introduced that made a lot of confusion then. Suddenyly
SizeOf(s) started showing wrong results. Suyddenly s[0] := #13 did not more change string's length, etc.
Frankly, i'd like every programmer read about ShortStrings mandatoriy, because without knowing that history you indeed can not grasp why dynarrays and long strings differ and has to memorize without understanding.
Oh, and more coans.
var w: WideString; a: AnsiString;
begin
a := '1234'; w := a; // the same value, right ?
WriteLn( SizeOf(a[1]): 10, SizeOf(a): 10); // expected, right?
WriteLn( SizeOf(w[1]): 10, SizeOf(w): 10); // did it scale well ?
end;
Ooops, that was for 32-bit code. For you it has to be
a := '12345678'; w := a; When you grasp that history it all is obvious and expected. When you had some experience with that 16-bits programminf - yet better.