是字符签名还是无符号默认?

在“完全引用C”一书中提到,char默认是无符号的。

但是我正试图用GCC和Visual Studio来validation这一点。 它是作为默认签名的。

哪一个是正确的?

这本书是错的。 该标准没有指定如果普通char有符号或无符号。

实际上,标准定义了三种不同的types: charsigned charunsigned char 。 如果你包含#include <limits.h> ,然后看看CHAR_MIN ,你可以发现,如果普通char是有signedunsigned (如果CHAR_MIN小于0或等于0),但即使如此,这三种types是截然不同的作为标准而言。

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

对于gcc,默认是有符号的,但是可以用-funsigned-char来修改。 注意:对于Android NDK中的gcc,默认是无符号的 。 您也可以使用-fsigned-char明确要求签名字符。

在MSVC上,默认是已签名的,但可以用/J修改。

C99 N1256草案 6.2.5 / 15“types”对于chartypes的签名有这个说法:

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

并在脚注中:

<limits.h>定义的CHAR_MIN将具有值0SCHAR_MIN ,并且这可以用于区分这两个选项。 无论做出什么select, char都是与其他两个不同的types,并且不兼容。

根据Dennis Ritchie的C语言书(这是ANSI C事实上的标准书籍),无论是有符号还是无符号的普通字符都是依赖于机器的,但是可打印的字符总是正的。

根据Bjarne Stroustrup的“C ++编程语言”, char是“实现定义的”。 它可以被signed charunsigned char取决于实施。 你可以通过使用std::numeric_limits<char>::is_signed来检查char是否被签名。

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

一般来说,实施者select哪一个更有效率地在其架构上实现。 在x86系统上,字符通常是被签名的。 在arm系统上它通常是无符号的(Apple iOS是个例外)。