#if !Rar2017_64bit using nint = System.Int32; using nuint = System.UInt32; using size_t = System.UInt32; #else using nint = System.Int64; using nuint = System.UInt64; using size_t = System.UInt64; #endif using int64 = System.Int64; notes on C->C# primitive mappings: nint := native integer nuint := native unsigned integer type 32b 64b mapping CAREFUL! char 8 bit 8 bit short unsigned char 8 bit 8 bit ushort short int 16 bit 16 bit short short int 16 bit 16 bit short unsigned short int 16 bit 16 bit ushort int 32 bit 32 bit int unsigned int 32 bit 32 bit uint long int 32 bit 64 bit nint *** unsigned long int 32 bit 64 bit nuint *** long long int 64 bit 64 bit long unsigned long long int 64 bit 64 bit ulong size_t 32 bit 64 bit nuint The size_t type is the unsigned integer type that is the result of the sizeof operator (and the offsetof operator), so it is guaranteed to be big enough to contain the size of the biggest object your system can handle (e.g., a static array of 8Gb). [size_t] -> ulong (x64) [size_t] -> uint (x86) size_t is an unsigned data type defined by several C/C++ standards, e.g. the C99 ISO/IEC 9899 standard, that is defined in stddef.h.1 It can be further imported by inclusion of stdlib.h as this file internally sub includes stddef.h. This type is used to represent the size of an object. Library functions that take or return sizes expect them to be of type or have the return type of size_t. Further, the most frequently used compiler-based operator sizeof should evaluate to a constant value that is compatible with size_t. 20171218 urggh, this allows things like new int[int.MaxValue] but NOT new byte[uint.MaxValue] currently arrays are limited to being indexed by an int hence int.MaxValue entries. weak. To get arrays > 2GB on x64 we need to configure https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element