char默认是签名还是未签名?

时间:2010-01-13 06:47:15

标签: c types char signed

在“C的完整参考”一书中,提到char默认是无符号的。

但我试图用GCC和Visual Studio验证这一点。它默认情况下将其作为签名

哪一个是正确的?

7 个答案:

答案 0 :(得分:173)

这本书错了。该标准未指定普通char是签名还是未签名。

事实上,该标准定义了三种不同的类型:charsigned charunsigned char。如果您#include <limits.h>然后查看CHAR_MIN,则可以看出普通charsigned还是unsigned(如果CHAR_MIN小于{{1}} 0或等于0),但就此而言,就标准而言,三种类型是不同的

答案 1 :(得分:58)

正如Alok所指出的那样,标准将其留给了实施。

对于gcc,默认为已签名,但您可以使用-funsigned-char对其进行修改。 注意:对于Android NDK中的gcc,默认为无符号。您还可以使用-fsigned-char明确要求签名字符。

在MSVC上,默认为已签名,但您可以使用/J修改该内容。

答案 2 :(得分:32)

C99 N1256 draft 6.2.5 / 15“类型”有关于char类型的签名的说法:

  

实现应将char定义为与signed char或unsigned char具有相同的范围,表示和行为。

并在脚注中:

  CHAR_MIN中定义的

<limits.h>将具有值0SCHAR_MIN中的一个,这可用于区分这两个选项。无论做出何种选择,char都是与其他两种类型不同的类型,并且与其中任何一种都不兼容。

答案 3 :(得分:7)

根据Dennis Ritchie的C编程语言书,它是ANSI C的事实上的标准书,无论是有符号还是无符号的纯字符都取决于机器,但可打印的字符总是正的。

答案 4 :(得分:6)

根据C标准,普通字符的签名是“实现定义”。

通常,实现者会选择在其架构上实现更高效的方法。在x86系统上,char通常是签名的。在arm系统上,它通常是未签名的(Apple iOS是一个例外)。

答案 5 :(得分:2)

根据&#34; C ++编程语言&#34;通过Bjarne Stroustrup,char是&#34;实现定义&#34;。它可以是signed charunsigned char,具体取决于实施情况。您可以使用char来检查std::numeric_limits<char>::is_signed是否已签名。

答案 6 :(得分:0)

现在,我们知道标准将其留给实现。

但是如何检查类型为signedunsigned,例如char

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

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

并使用gccclangcl进行测试。但是我不确定在其他情况下它总是安全的。