《C语言完全参考》一书中提到: char 默认情况下是无符号的。

但我正在尝试使用 GCC 和 Visual Studio 来验证这一点。它把它当作 默认情况下。

哪一个是正确的?

有帮助吗?

解决方案

书是错误的。如果纯char是有符号或无符号的标准没有规定。

在实际上,标准定义了三种不同类型的:charsigned char,和unsigned char。如果#include <limits.h>再看看CHAR_MIN,可以找出是否平原charsignedunsigned(如果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>定义,将具有值0SCHAR_MIN之一,并且这可以用于区分这两个选项。无论作出的选择的,char是从其他两个单独的类型和不与任一兼容。

据丹尼斯里奇C程序设计语言书是用于ANSI C的事实上的标准书,平原字符或者符号或无符号是机器相关的,但是可打印字符总是正。

据C标准纯炭的符号性为“实现定义”。

在一般实现者选择了任何一个是更有效的对他们的架构来实现。在x86系统上的焦炭通常签署。 ARM系统上它一般无符号(苹果iOS是一个例外)。

据 “C ++程序设计语言” 由Bjarne Stroustrup的,char是 “实现定义”。它可以signed charunsigned char取决于实现。您可以检查char是否通过使用std::numeric_limits<char>::is_signed签署与否。

现在,我们已知的标准叶子,到实现。

但是,如何检查类型 signedunsigned, 如 char?

我写了一个宏要做到这一点:

#define IS_UNSIGNED(t) ((t)~1 > 0)

和测试它 gcc, clang, , cl.但我不确定它是始终是安全的其他情况。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top