Signed char - What Foolishness Is This!

Doug Gwyn gwyn at brl-smoke.ARPA
Sun Oct 19 12:08:52 AEST 1986


In article <8719 at duke.duke.UUCP> jwg at duke.UUCP (Jeffrey William Gillette) writes:
>     #define isupper(c)     ( (_ctype+1)[c] & _UPPER )
>
>The problem here lies with Microsoft.

No, the problem lies with the programmer.  The is*() functions have
(int), not (char), arguments.  When you feed one a (char), it will
be promoted to an (int) by the usual rules, including possible sign
extension.  The macro definition acts the same as a function in this
regard, since array indices are (int), not (char), also.  Microsoft's
definition is correct.

>1)      Do other C compilers make 'char' a signed quantity by default?

Dennis Ritchie's original (PDP-11) C compiler did.

>2)      What possible justification is there for this default?

(a) less cost on machines like the PDP-11

(b) the programmer can, using suitable code, force whatever behavior
	he wants

>I mean is, what is the definition of a negative 'a'?

It might surprise you to learn that 'a' represents an (int) constant,
not a (char).  C (char)s are just short integral types whose signedness
depends on the implementation (however, (signed char) and (unsigned char)
have definite signedness).  Dennis intended that sizeof(char)==1 but
I can make a strong argument that that isn't necessary.

P.S.  I suggest people learn what is going on before raving about it.
That would sure reduce the noise level of net.lang.c.



More information about the Comp.lang.c mailing list