Das mit den 0-255 hast du falsch verstanden.
1-Byte wäre es, wenn es sich auf ENUMs bezieht, aber die können bis 64 Bit groß werden (0-255=Byte, 256-65.535=Word, ...=LargeWord und auch abhängig von
{$MinEnumSize x}
), bei Verwendung des IN-Operators kann man davon aber nur 0-255 abfragen.
Der Compiler nutzt für SETs aber beim IN einen Assemblerbefehl, der nur eine Bit-Adressierung mit einem Byte unterstützt, weswegen
SETs auf 256 Bits (Werte/ENUMs) unterstützt werden, also bis zu 32 Bytes.
Das ist auch der Grund, warum man bei WideChar kein IN verwenden kann, obwohl man das im Compiler auch hätte bugfixen können. (selber eine Prüfung implementieren, bzw. bei der Prüfung das unterde Byte des Index über den schon verwendeten
ASM-Befehl und die höheren Byte als Speicheroffest i*32, vorallem da dieser
ASM-Befehl nicht gerade schnell ist und man das mit einem ByteOffest+Shift+AND hätte womöglich schneller prüfen können)
Code:
Unit6.pas.29: Exclude(A, 'b');
004AB648 8065E4FB and byte ptr [ebp-$1c],$
fb
Unit6.pas.30: Include(A, 'b');
004AB64C 804DE404 or byte ptr [ebp-$1c],$04
Unit6.pas.31: if 'b' in a then ;
004AB650 F645E404 test byte ptr [ebp-$1c],$04
004AB654 7407 jz $004AB656
https://en.wikipedia.org/wiki/TEST_(x86_instruction)