Что вызывает, если char
в C (с использованием gcc) подписан или без знака? Я знаю, что стандарт не диктует один над другим и что я могу проверять CHAR_MIN
и CHAR_MAX
на limits.h, но я хочу знать, какие триггеры срабатывают друг над другом при использовании gcc
Если я читаю limit.h из libgcc-6, я вижу, что есть макрос __CHAR_UNSIGNED__
, который определяет "default" char подписанный или неподписанный, но я не уверен, установлен ли это компилятором в (его ) построенное время.
Я попытался перечислить предопределенные макросы GCC с помощью
$ 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
но не смог найти __CHAR_UNSIGNED__
Фон: у меня есть код, который я компилирую на двух разных машинах:
Настольный ПК:
- Debian GNU/Linux 9.1 (растяжка)
- gcc версия 6.3.0 20170516 (Debian 6.3.0-18)
- Intel (R) Core (TM) i3-4150
- libgcc-6-dev: 6.3.0-18
-
char
подписан
Малина Pi3:
- Raspbian GNU/Linux 9.1 (растяжка)
- gcc версия 6.3.0 20170516 (Raspbian 6.3.0-18 + rpi1)
- ARMv7 Processor rev 4 (v7l)
- libgcc-6-dev: 6.3.0-18 + rpi
-
char
не указано
Таким образом, единственным очевидным отличием является архитектура процессора...