In our previous episode, Graeme Geldenhuys said:
But from your
comments Cardinal has a long history in Pascal.
It is the base type of Pascal sucessor Modula 2. (well, in all caps, since it is a case sensitive language)
GNU Pascal also uses it heavily, but their help
http://www.gnu-pascal.de/gpc/Cardinal.html seems to indicate it is not in the Pascal standards.
But many dialects imported features from M2, like e.g. the unit system, and it seems to be a common convention for it to be unsigned as in M2.
But as always with extensions/backports, the exact definition is typically not specified.
But usually it is some unsigned main type probably because in Modula2 INTEGER is the signed complement to basetype CARDINAL, so it makes sense to keep them paired and reverse them in Pascal. Combinations (SHORT, LONG etc) exist too, some M2 dialects abbreviated CARDINAL combinations to -CARD like LONGCARD, some keep it long as LONGCARDINAL.
All -word named types are OS dependent, and systematically wrong on 32+ systems. This because the word=16-bit convention is a 16-bit DOS one, that stuck because of evolution via win16 to win32/64. Also the old conventions of having a very big base type and subtype it as needed is a bit dated.
Moreover since shorter types are not always faster, I think it is better to forget all this, and in new code use INTEGER for the variable types, where range doesn't matter (much) and (u)int<xx> for the rest.
From a language design viewpoint I would add CARDINAL for unsigned integers
variable types, but since it has a fixed type history in Delphi, it is better not to. It isn't needed that much anyway, and for the most common use, API interfacing fixed types or ctypes types are usually better.