在“C的完整参考”一书中,提到char
默认是无符号的。
但我试图用GCC和Visual Studio验证这一点。它默认情况下将其作为签名。
哪一个是正确的?
答案 0 :(得分:173)
这本书错了。该标准未指定普通char
是签名还是未签名。
事实上,该标准定义了三种不同的类型:char
,signed char
和unsigned char
。如果您#include <limits.h>
然后查看CHAR_MIN
,则可以看出普通char
是signed
还是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>
将具有值0
或SCHAR_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 char
或unsigned char
,具体取决于实施情况。您可以使用char
来检查std::numeric_limits<char>::is_signed
是否已签名。
答案 6 :(得分:0)
现在,我们知道标准将其留给实现。
但是如何检查类型为signed
或unsigned
,例如char
?
我写了一个宏来做到这一点:
#define IS_UNSIGNED(t) ((t)~1 > 0)
并使用gcc
,clang
和cl
进行测试。但是我不确定在其他情况下它总是安全的。