在《C语言程序设计全面指南》一书中提到,
char
默认是无符号的。
但我正试着用GCC和Visual Studio验证这一点。结果默认情况下被视为有符号的。
那么哪一个是正确的呢?这本书是错误的。标准并没有规定纯粹的char
是有符号还是无符号。
实际上,标准定义了三种不同的类型:char
、signed char
和unsigned char
。如果你#include <limits.h>
并查看CHAR_MIN
,就可以知道纯粹的char
是signed
还是unsigned
(如果CHAR_MIN
小于0或等于0),但即使如此,就标准而言,这三种类型是不同的。
需要注意的是,char
在这方面是特殊的。如果你将一个变量声明为int
,它与声明为signed int
是完全等价的。对于所有编译器和架构来说,这一点始终如一。
char
是唯一可以有符号或无符号类型的数据类型。例如,int
等同于signed int
。 - Alok Singhalint
的位域(bit field)是否有符号也是实现定义的。 - Keith Thompsonchar
视为无符号或者如果不能这样做则拒绝编译”之类的内容?我理解标准必须允许存在不同方言的C语言,但是如果没有标准的方法来表达0xFFFF+1
是否应该产生0u
或65536,那么我认为这样的表达式应该被视为在“标准C”中毫无意义。 - supercat#if CHAR_MIN < 0
... #error "Plain char is signed"
... #endif
@supercat:#if CHAR_MIN < 0
... #error“普通字符是有符号的”
... #endif
- Keith Thompson正如Alok所指出的,标准将其委托给实现。
对于gcc,默认值为signed,但可以使用-funsigned-char
进行修改。注意: 对于Android NDK中的gcc,默认值为unsigned。你也可以使用-fsigned-char
明确要求有符号字符。
在MSVC上,默认值为signed,但可以使用/J
进行修改。
C99 N1256草案6.2.5/15 "类型"中关于类型char
的有关签名的规定如下:
实现应定义
char
类型具有与signed char
或unsigned char
之一相同的范围、表示和行为。
并在一个脚注中指出:
<limits.h>
中定义的CHAR_MIN
将具有值0
或SCHAR_MIN
之一,这可以用于区分两个选项。无论做出何种选择,char
都是与另外两个类型不兼容的独立类型。
char
可以是无符号的,因此使用getchar()
读取值时,通常使用int
作为规则。getchar()
可能会返回EOF
。EOF
通常定义为-1
或其他负值,在unsigned
中存储不是您想要的结果。这是声明:extern int getchar();
顺便说一句,这个建议也来自于《C: A Reference Manual》书籍。 - Maxim Chetruscasigned char
的情况下,你也必须使用int
来存储返回值。 - Antti Haapala -- Слава Україні