题
《C语言完全参考》一书中提到: char
默认情况下是无符号的。
但我正在尝试使用 GCC 和 Visual Studio 来验证这一点。它把它当作 签 默认情况下。
哪一个是正确的?
解决方案
书是错误的。如果纯char
是有符号或无符号的标准没有规定。
在实际上,标准定义了三种不同类型的:char
,signed char
,和unsigned char
。如果#include <limits.h>
再看看CHAR_MIN
,可以找出是否平原char
是signed
或unsigned
(如果CHAR_MIN
小于0或等于0),但即使如此,在三种类型是不同的如据的标准而言。
请注意,char
在这样特殊的。如果一个变量声明为int
就等于宣告它作为signed int
100%。这始终是对所有的编译器和架构实现。
其他提示
作为 阿洛克指出, ,该标准将其留给实施。
对于 gcc,默认已签名,但您可以使用以下命令进行修改 -funsigned-char
. 笔记: 对于Android NDK中的gcc,默认是无符号的. 。您还可以明确要求签名字符 -fsigned-char
.
在 MSVC 上,默认已签名,但您可以使用以下命令进行修改 /J
.
C99 N1256草案 6.2.5 / 15“类型”有此说关于类型char
的签署岬:
的执行应限定char,使其具有相同的范围,表示和行为作为有符号char或unsigned char
和在脚注:
CHAR_MIN
,在<limits.h>
定义,将具有值0
或SCHAR_MIN
之一,并且这可以用于区分这两个选项。无论作出的选择的,char
是从其他两个单独的类型和不与任一兼容。
据丹尼斯里奇C程序设计语言书是用于ANSI C的事实上的标准书,平原字符或者符号或无符号是机器相关的,但是可打印字符总是正。
据C标准纯炭的符号性为“实现定义”。
在一般实现者选择了任何一个是更有效的对他们的架构来实现。在x86系统上的焦炭通常签署。 ARM系统上它一般无符号(苹果iOS是一个例外)。
据 “C ++程序设计语言” 由Bjarne Stroustrup的,char
是 “实现定义”。它可以signed char
或unsigned char
取决于实现。您可以检查char
是否通过使用std::numeric_limits<char>::is_signed
签署与否。
现在,我们已知的标准叶子,到实现。
但是,如何检查类型 signed
或 unsigned
, 如 char
?
我写了一个宏要做到这一点:
#define IS_UNSIGNED(t) ((t)~1 > 0)
和测试它 gcc
, clang
, , cl
.但我不确定它是始终是安全的其他情况。