Are there machines (or compilers), where sizeof(char) != 1
?
Does C99 standard says that sizeof(char)
on standard compliance implementation MUST be exactly 1? If it does, please, give me section number and citation.
Update:
If I have a machine (CPU), which can't address bytes (minimal read is 4 bytes, aligned), but only 4-s of bytes (uint32_t
), can compiler for this machine define sizeof(char)
to 4?sizeof(char)
will be 1, but char will have 32 bits (CHAR_BIT
macros)
Update2: But sizeof result is NOT a BYTES ! it is the size of CHAR. And char can be 2 byte, or (may be) 7 bit?
Update3:
Ok. All machines have sizeof(char) == 1
. But what machines have CHAR_BIT > 8
?
It is always one in C99, section 6.5.3.4:
When applied to an operand that has type
char
,unsigned char
, orsigned char
, (or a qualified version thereof) the result is1
.
Edit: not part of your question, but for interest from Harbison and Steele's. C: A Reference Manual, Third Edition, Prentice Hall, 1991 (pre c99) p. 148:
A storage unit is taken to be the amount of storage occupied by one character; the size of an object of type
char
is therefore1
.
Edit: In answer to your updated question, the following question and answer from Harbison and Steele is relevant (ibid, Ex. 4 of Ch. 6):
Is it allowable to have a C implementation in which type
char
can represent values ranging from -2,147,483,648 through 2,147,483,647? If so, what would besizeof(char)
under that implementation? What would be the smallest and largest ranges of typeint
?
Answer (ibid, p. 382):
It is permitted (if wasteful) for an implementation to use 32 bits to represent type
char
. Regardless of the implementation, the value ofsizeof(char)
is always 1.
While this does not specifically address a case where, say bytes are 8 bits and char
are 4 of those bytes (actually impossible with the c99 definition, see below), the fact that sizeof(char) = 1
always is clear from the c99 standard and Harbison and Steele.
Edit: In fact (this is in response to your upd 2 question), as far as c99 is concerned sizeof(char)
is in bytes, from section 6.5.3.4 again:
The
sizeof
operator yields the size (in bytes) of its operand
so combined with the quotation above, bytes of 8 bits and char
as 4 of those bytes is impossible: for c99 a byte is the same as a char
.
In answer to your mention of the possibility of a 7 bit char
: this is not possible in c99. According to section 5.2.4.2.1 of the standard the minimum is 8:
Their implementation-defined values shall be equal or greater [my emphasis] in magnitude to those shown, with the same sign.
— number of bits for smallest object that is not a bit-field (byte)
CHAR_BIT 8
— minimum value for an object of type
signed char
SCHAR_MIN -127
— maximum value for an object of type
signed char
SCHAR_MAX +127
— maximum value for an object of type
unsigned char
UCHAR_MAX 255
— minimum value for an object of type
char
CHAR_MIN
see below— maximum value for an object of type
char
CHAR_MAX
see below[...]
If the value of an object of type
char
is treated as a signed integer when used in an expression, the value ofCHAR_MIN
shall be the same as that ofSCHAR_MIN
and the value ofCHAR_MAX
shall be the same as that ofSCHAR_MAX
. Otherwise, the value ofCHAR_MIN
shall be0
and the value ofCHAR_MAX
shall be the same as that ofUCHAR_MAX
. The valueUCHAR_MAX
shall equal 2CHAR_BIT − 1.