dave@murphy.UUCP (H. Munster) (10/30/86)
Signed char exists because, on the PDP-11 (which is where one of the first C compilers was implemented), it's more efficient to treat them as signed. (The default for loading a byte is to sign-extend it, and if you don't want the sign you have to mask it off, which takes an extra instruction.) K&R states on p. 183 that the implementation may treat characters as either signed or unsigned. (However, it also states that a member of the "standard" character set should be represented as a non-negative quantity. The def- inition of the term "standard" is, of course, open to interpretation and flaming.) Unless your compiler has an "unsigned char" type, and you use it, it's kind of dangerous to rely on the sign of a char. Probably someone should have thought of inventing a "signed char" type earlier, but that's life. Actually, I believe most machines that C exists on treat chars as unsigned. On the Gould UTX compiler, the default is to treat chars not explicitly declared unsigned as signed. This is so that anything that you might port over from a PDP-11 will work (apparently it made porting of some things easier when UN*X was originally ported to these machines). However, there is a compiler option that will make all chars unsigned, so if you're porting something from a VAX, you can have it that way too. (Actually, the most efficient mode is the all-unsigned mode, so the sense of the option should probably be reversed.) Incidentally, I am one of those cretins that sometimes uses "unsigned char" instead of "unsigned short"; I have an application where I save over 2M of memory by doing that. I have never found a use for signed chars. --- It's been said by many a wise philosopher that when you die and your soul goes to its final resting place, it has to make a connection in Atlanta. Dave Cornutt, Gould Computer Systems, Ft. Lauderdale, FL UUCP: ...{sun,pur-ee,brl-bmd}!gould!dcornutt or ...!ucf-cs!novavax!houligan!dcornutt ARPA: wait a minute, I've almost got it... "The opinions expressed herein are not necessarily those of my employer, not necessarily mine, and probably not necessary."
guy@sun.uucp (Guy Harris) (11/03/86)
> ...However, there is a compiler option that will make all chars unsigned, > so if you're porting something from a VAX, you can have it that way too. If you're porting something from a VAX, you're in for one hell of a surprise if you turn on the "make chars unsigned by default" option; the UNIX C compiler for the VAX (and probably the VMS compiler as well) treats "char" as a request for a signed character. > I have never found a use for signed chars. V6 UNIX did; the "p_pri" field in the "proc" structure held the process priority, and the range of priorities included both positive and negative values. Since V7 was ported to an Interdata machine, whose compiler treated "char" as a request for an unsigned character, an bias PZERO was added so that the range of priorities started at 0. Note, however, that this was a use for signed "char"s, NOT for signed characters. Unfortunately, C conflates the notion of "character" and "very small integer" into one type, namely "char". -- Guy Harris {ihnp4, decvax, seismo, decwrl, ...}!sun!guy guy@sun.com (or guy@sun.arpa)