在书"Complete Reference of C"中提到 char 默认是无符号的 .
char
但我试图用GCC和Visual Studio验证这一点 . 它默认签名 .
哪一个是正确的?
C99 N1256 draft 6.2.5 / 15 "Types"有关于 char 类型的签名的说法:
实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为 .
并在脚注中:
<limits.h>中定义的CHAR_MIN将具有值0或SCHAR_MIN之一,这可用于区分这两个选项 . 无论做出何种选择,char都是与其他两种类型不同的类型,并且与两者都不兼容 .
根据Dennis Ritchie的C编程语言书,这是ANSI C的事实上的标准书,无论是有符号还是无符号的普通字符都取决于机器,但可打印字符总是正面的 .
根据C标准,普通字符的签名是“实现定义” .
通常,实现者会选择在其体系结构上实现更高效的方法 . 在x86系统上,char通常是签名的 . 在arm系统上,它通常是未签名的(Apple iOS是一个例外) .
正如Alok指出的那样,标准将其留给了实施 .
对于gcc,默认值是signed,但您可以使用 -funsigned-char 进行修改 . 注意:对于Android NDK中的gcc,默认为unsigned . 您还可以使用 -fsigned-char 明确要求签名字符 .
-funsigned-char
-fsigned-char
在MSVC上,默认值已签名,但您可以使用 /J 进行修改 .
/J
这本书错了 . 该标准未指定普通 char 是有符号还是无符号 .
实际上,该标准定义了三种不同的类型: char , signed char 和 unsigned char . 如果您 #include <limits.h> 然后查看 CHAR_MIN ,您可以看出普通 char 是 signed 还是 unsigned (如果 CHAR_MIN 小于0或等于0),但即便如此,就标准而言,这三种类型是不同的 .
signed char
unsigned char
#include <limits.h>
CHAR_MIN
signed
unsigned
根据Bjarne Stroustrup的"The C++ Programming Language", char 是"implementation defined" . 根据实施情况,它可以是 signed char 或 unsigned char . 您可以使用 std::numeric_limits<char>::is_signed 检查 char 是否已签名 .
std::numeric_limits<char>::is_signed
6 回答
C99 N1256 draft 6.2.5 / 15 "Types"有关于
char
类型的签名的说法:并在脚注中:
根据Dennis Ritchie的C编程语言书,这是ANSI C的事实上的标准书,无论是有符号还是无符号的普通字符都取决于机器,但可打印字符总是正面的 .
根据C标准,普通字符的签名是“实现定义” .
通常,实现者会选择在其体系结构上实现更高效的方法 . 在x86系统上,char通常是签名的 . 在arm系统上,它通常是未签名的(Apple iOS是一个例外) .
正如Alok指出的那样,标准将其留给了实施 .
对于gcc,默认值是signed,但您可以使用
-funsigned-char
进行修改 . 注意:对于Android NDK中的gcc,默认为unsigned . 您还可以使用-fsigned-char
明确要求签名字符 .在MSVC上,默认值已签名,但您可以使用
/J
进行修改 .这本书错了 . 该标准未指定普通
char
是有符号还是无符号 .实际上,该标准定义了三种不同的类型:
char
,signed char
和unsigned char
. 如果您#include <limits.h>
然后查看CHAR_MIN
,您可以看出普通char
是signed
还是unsigned
(如果CHAR_MIN
小于0或等于0),但即便如此,就标准而言,这三种类型是不同的 .根据Bjarne Stroustrup的"The C++ Programming Language",
char
是"implementation defined" . 根据实施情况,它可以是signed char
或unsigned char
. 您可以使用std::numeric_limits<char>::is_signed
检查char
是否已签名 .