是字符签名还是无符号默认?
在“完全引用C”一书中提到,char默认是无符号的。
但是我正试图用GCC和Visual Studio来validation这一点。 它是作为默认签名的。
哪一个是正确的?
这本书是错的。 该标准没有指定如果普通char
有符号或无符号。
实际上,标准定义了三种不同的types: char
, signed char
和unsigned char
。 如果你包含#include <limits.h>
,然后看看CHAR_MIN
,你可以发现,如果普通char
是有signed
或unsigned
(如果CHAR_MIN
小于0或等于0),但即使如此,这三种types是截然不同的作为标准而言。
正如Alok所指出的那样,这个标准留给了实施。
对于gcc,默认是有符号的,但是可以用-funsigned-char
来修改。 注意:对于Android NDK中的gcc,默认是无符号的 。 您也可以使用-fsigned-char
明确要求签名字符。
在MSVC上,默认是已签名的,但可以用/J
修改。
C99 N1256草案 6.2.5 / 15“types”对于char
types的签名有这个说法:
实现应该定义char与signed char或unsigned char具有相同的范围,表示和行为。
并在脚注中:
在
<limits.h>
定义的CHAR_MIN
将具有值0
或SCHAR_MIN
,并且这可以用于区分这两个选项。 无论做出什么select,char
都是与其他两个不同的types,并且不兼容。
根据Dennis Ritchie的C语言书(这是ANSI C事实上的标准书籍),无论是有符号还是无符号的普通字符都是依赖于机器的,但是可打印的字符总是正的。
根据Bjarne Stroustrup的“C ++编程语言”, char
是“实现定义的”。 它可以被signed char
或unsigned char
取决于实施。 你可以通过使用std::numeric_limits<char>::is_signed
来检查char
是否被签名。
根据C标准,简单字符的签名是“实现定义的”。
一般来说,实施者select哪一个更有效率地在其架构上实现。 在x86系统上,字符通常是被签名的。 在arm系统上它通常是无符号的(Apple iOS是个例外)。