Alo*_*hal 188
这本书错了.该标准未指定plain char是签名还是未签名.
实际上,标准定义了三种不同的类型:char,signed char,和unsigned char.如果你#include <limits.h>然后看一下CHAR_MIN,你可以看出是否char是signed或是unsigned(如果CHAR_MIN小于0或等于0),但即便如此,就标准而言,这三种类型是不同的.
R S*_*hko 65
正如Alok指出的那样,标准将其留给了实施.
对于gcc,默认值是signed,但您可以使用-funsigned-char.注意:对于Android NDK中的gcc,默认为unsigned.您还可以明确要求签名字符-fsigned-char.
在MSVC上,默认值已签名,但您可以使用/J.
Mic*_*urr 34
C99 N1256草案 6.2.5/15"类型"有关于签名类型的说法char:
实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为.
并在脚注中:
CHAR_MIN,定义在<limits.h>,将具有其中一个值0或SCHAR_MIN,这可用于区分这两个选项.无论做出char何种选择,都是与其他两种类型不同的类型,并且与两者都不兼容.
小智 7
根据Dennis Ritchie的C编程语言书,这是ANSI C的事实上的标准书,无论是有符号还是无符号的普通字符都取决于机器,但可打印字符总是正面的.
根据C标准,普通字符的签名是"实现定义".
一般来说,实现者选择在他们的架构上实现更高效的那个.在x86系统上,char通常是签名的.在arm系统上,它通常是未签名的(Apple iOS是一个例外).