In the book "Complete Reference of C" it is mentioned that
char is by default unsigned.
But I am trying to verify this with GCC as well as Visual Studio. It is taking it as signed by default.
Which one is correct?
The book is wrong. The standard does not specify if plain
char is signed or unsigned.
In fact, the standard defines three distinct types:
signed char, and
unsigned char. If you
#include <limits.h> and then look at
CHAR_MIN, you can find out if plain
CHAR_MIN is less than 0 or equal to 0), but even then, the three types are distinct as far as the standard is concerned.
Do note that
char is special in this way. If you declare a variable as
int it is 100% equivalent to declaring it as
signed int. This is always true for all compilers and architectures.
As Alok points out, the standard leaves that up to the implementation.
For gcc, the default is signed, but you can modify that with
-funsigned-char. note: for gcc in Android NDK, the default is unsigned. You can also explicitly ask for signed characters with
On MSVC, the default is signed but you can modify that with
C99 N1256 draft 6.2.5/15 "Types" has this to say about the signed-ness of type
The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
and in a footnote:
CHAR_MIN, defined in
<limits.h>, will have one of the values
SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made,
charis a separate type from the other two and is not compatible with either.
According to the C standard the signedness of plain char is "implementation defined".
In general implementors chose whichever was more efficient to implement on their architecture. On x86 systems char is generally signed. On arm systems it is generally unsigned (Apple iOS is an exception).
According to The C Programming Language book by Dennis Ritchie which is the de-facto standard book for ANSI C, plain chars either signed or unsigned are machine dependent, but printable characters are always positive.
Now, we known the standard leaves that up to the implementation.
But how to check a type is
unsigned, such as
I wrote a macro to do this:
#define IS_UNSIGNED(t) ((t)~1 > 0)
and test it with
cl. But I do not sure it's always safe for other cases.