【发布时间】:2011-04-13 06:50:37
【问题描述】:
是否有任何 C 编译器将默认类型的 char 视为无符号,除非用户在文件或项目设置中明确提及?
/卡努_
【问题讨论】:
标签: c compiler-construction char signed unsigned-char
是否有任何 C 编译器将默认类型的 char 视为无符号,除非用户在文件或项目设置中明确提及?
/卡努_
【问题讨论】:
标签: c compiler-construction char signed unsigned-char
GCC 可以。但仅在为约定为 unsigned char 的平台编译时,包括 ARM linux[*]。当 GCC 为 x86 编译时,默认为 char 被签名。
[*] 或者至少在过去是这样。据我所知,从那以后,Linux 已经在 ARM 上切换到了不同的默认 ABI。
2013 年更新: 适用于 Android NDK 的 ARM 编译器(gcc、clang)默认为 unsigned char。 x86 和 MIPS 编译器默认为 signed char。
【讨论】:
标准要求标准要求的所有字符(AZ、az、0-9、基本标点符号等)的整数值为正数,因此任何使用这些字符值超出范围的编码的系统signed char 的 必须 有普通的 char 未签名。我相信这意味着所有 EBCDIC 系统都必须有一个未签名的普通 char,但我可能弄错了。
【讨论】:
CHAR_BIT > 8,则char 的值范围大于-128..127 或0..255。因此,在 CHAR_BIT == 9 的 EBCDIC 系统上,可以对普通的 char 进行签名。
通常有一个选项可以将其设置为默认值,但据我所知,没有编译器会这样做。
【讨论】:
/J (Default char Type Is unsigned)。在 GCC 中,您使用 -funsigned-char