On Wed, Sep 23, 2015 at 8:30 AM, Jay Jaeger <cu...@charter.net> wrote: > An int just has to be able to store numbers of a certain magnitude. > Same with long. You do have to be able to convert between longs (and > possibly ints) and addresses (*). So, you make an int 5 digits (which > matches the natural length of addresses) and longs something like 10 > digits. You don't have to simulate anything, near as I can tell. Then > the length of an int is 5 and a long is 10 (instead of the more typical > 2 and 4).
And the length of a char? It's required that all types other than bitfields be fully represented as multiple chars, not e.g. an int being two and a half chars, and a char has to cover at least the range 0..255, or -128..127, and it has to have a range based on a power of two. ISO/IEC 9899:1999(E) §3.6 ¶1 - a byte has to hold any member of the basic character set ISO/IEC 9899:1999(E) §3.7.1 ¶1 - a character is a C bit representation that fits in a byte ISO/IEC 9899:1999(E) §5.2.4.2.1 ¶1 - the size of a char is CHAR_BIT bits, which is at least 8 ISO/IEC 9899:1999(E) §6.2.6.1 ¶2-4 - everything other than bitfields consists of bytes ISO/IEC 9899:1999(E) §6.2.6.1 ¶5 - Some data types other than char may have machine representations that can't use all of the possible bit patterns of the storage allocated; those representations are called "trap representations". The char (and unsigned char) types can't have trap representations. ISO/IEC 9899:199(E) §6.2.6.2 ¶1 - unsigned integer types must have a range of 0 to (2^n)-1, for some natural number n. ISO/IEC 9899:199(E) §6.2.6.2 ¶2 - signed integer types must have a range of -(2^n) to (2^n)-1 or -((2^n)-1) to (2^n)-1. On a decimal machine, if you use three digits for a char, you have to arrange that all your other types are multiples of three digits, with each three-digit group only using valid char representations, because accessing a char/byte out of a larger integer type is not allowed to be a trap representation, because chars can't have a trap representation. If an unsigned char is three digits with values from 0..255, an unsigned int can't be five digits. It has to be six digits, and the only valid representations for it would have values of 0..65535. It can't have any valid values in the range of 65536..999999.