What causes if a char
in C (using gcc) is signed or unsigned? I know that the standard doesn't dictate one over the other and that I can check CHAR_MIN
and CHAR_MAX
from limits.h but I want to know what triggers one over the other when using gcc
If I read limits.h from libgcc-6 I see that there is a macro __CHAR_UNSIGNED__
which defines a "default" char signed or unsigned but I'm unsure if this is set by the compiler at (his) built time.
I tried to list GCCs predefined makros with
$ gcc -dM -E -x c /dev/null | grep -i CHAR
#define __UINT_LEAST8_TYPE__ unsigned char
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __SCHAR_MAX__ 0x7f
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __UINT8_TYPE__ unsigned char
#define __INT8_TYPE__ signed char
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __CHAR16_TYPE__ short unsigned int
#define __INT_LEAST8_TYPE__ signed char
#define __WCHAR_TYPE__ int
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 4
#define __INT_FAST8_TYPE__ signed char
#define __CHAR32_TYPE__ unsigned int
#define __UINT_FAST8_TYPE__ unsigned char
but wasn't able to find __CHAR_UNSIGNED__
Background: I've some code which I compile on two different machines:
Desktop PC:
- Debian GNU/Linux 9.1 (stretch)
- gcc version 6.3.0 20170516 (Debian 6.3.0-18)
- Intel(R) Core(TM) i3-4150
- libgcc-6-dev: 6.3.0-18
char
is signed
Raspberry Pi3:
- Raspbian GNU/Linux 9.1 (stretch)
- gcc version 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1)
- ARMv7 Processor rev 4 (v7l)
- libgcc-6-dev: 6.3.0-18+rpi
char
is unsigned
So the only obvious difference is the CPU architecture...
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…