On Tue, 2007-01-23 at 23:19 -0600, [EMAIL PROTECTED] wrote: > GCC should treat plain char in the same fashion on all types of machines > (by default).
No, no, no. It is up to the ABI what char is. > The ISO C standard leaves it up to the implementation whether a char > declared plain char is signed or not. This in effect creates two > alternative dialects of C. So ... char is seperate type from unsigned char and signed char in C and C++ anyways. > The preferred dialect makes plain char signed, because this is simplest. > Since int is the same as signed int, short is the same as signed short, > etc., it is cleanest for char to be the same. No, no. > Some computer manufacturers have published Application Binary Interface > standards which specify that plain char should be unsigned. It is a > mistake, however, to say anything about this issue in an ABI. This is > because the handling of plain char distinguishes two dialects of C. Both > dialects are meaningful on every type of machine. Whether a particular > object file was compiled using signed char or unsigned is of no concern > to other object files, even if they access the same chars in the same > data structures. No it is not. The reason is for an example on PPC, there is no signed extended byte loads, only unsigned. There is a reason why it is unsigned on those targets. > Many users appreciate the GNU C compiler because it provides an > environment that is uniform across machines. These users would be > inconvenienced if the compiler treated plain char differently on certain > machines. So don't depend on this behavior. There are plenty of implementation details. > There are some arguments for making char unsigned by default on all > machines. If, for example, this becomes a universal de facto standard, > it would make sense for GCC to go along with it. This is something to be > considered in the future. No, no, no. GCC cannot change right now, as it would change the ABI. If you don't believe me, try this program with/without -fsigned-char and -funsigned-char: static inline int f(int a) { return a==0xFF; } int g(char *b) { return f(*b); } --------------- You will see with -fsigned-char, we get 0; with -funsigned-char, we compare to *(unsigned char*)b 0xFF -- Pinski