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是一个例外).