【发布时间】:2018-03-09 20:07:14
【问题描述】:
如果 C(使用 gcc)中的 char 是有符号或无符号的,会导致什么原因?我知道标准并没有规定另一个,我可以从limits.h中检查CHAR_MIN和CHAR_MAX,但我想知道使用gcc时是什么触发了另一个
如果我从 libgcc-6 中读取 limits.h,我看到有一个宏 __CHAR_UNSIGNED__ 定义了一个“默认”char 有符号或无符号,但我不确定这是否由编译器在(他的)构建时设置时间。
我试图列出 GCC 预定义的 makros 与
$ 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)
- 英特尔(R) Core(TM) i3-4150
- libgcc-6-dev: 6.3.0-18
-
char已签名
树莓派3:
- Raspbian GNU/Linux 9.1(拉伸)
- gcc 版本 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1)
- ARMv7 处理器第 4 版 (v7l)
- libgcc-6-dev: 6.3.0-18+rpi
-
char未签名
所以唯一明显的区别是 CPU 架构...
【问题讨论】:
-
...简而言之,为什么不应该使用字符。
-
Is char signed or unsigned by default?。尽管您可以通过选项更改它,但大多数现代实现都将具有签名 char。一个值得注意的例外是 ARM,由于 performance reasons
-
在 Linux 上似乎至少在签名和未签名之间有 50/50 的比例。 wiki.debian.org/ArchitectureSpecificsMemo