首页 文章

char默认是签名还是未签名?

提问于
浏览
128

在书"Complete Reference of C"中提到 char 默认是无符号的 .

但我试图用GCC和Visual Studio验证这一点 . 它默认签名 .

哪一个是正确的?

6 回答

  • 5

    C99 N1256 draft 6.2.5 / 15 "Types"有关于 char 类型的签名的说法:

    实现应将char定义为具有与signed char或unsigned char相同的范围,表示和行为 .

    并在脚注中:

    <limits.h>中定义的CHAR_MIN将具有值0或SCHAR_MIN之一,这可用于区分这两个选项 . 无论做出何种选择,char都是与其他两种类型不同的类型,并且与两者都不兼容 .

  • 2

    根据Dennis Ritchie的C编程语言书,这是ANSI C的事实上的标准书,无论是有符号还是无符号的普通字符都取决于机器,但可打印字符总是正面的 .

  • 58

    根据C标准,普通字符的签名是“实现定义” .

    通常,实现者会选择在其体系结构上实现更高效的方法 . 在x86系统上,char通常是签名的 . 在arm系统上,它通常是未签名的(Apple iOS是一个例外) .

  • 167

    正如Alok指出的那样,标准将其留给了实施 .

    对于gcc,默认值是signed,但您可以使用 -funsigned-char 进行修改 . 注意:对于Android NDK中的gcc,默认为unsigned . 您还可以使用 -fsigned-char 明确要求签名字符 .

    在MSVC上,默认值已签名,但您可以使用 /J 进行修改 .

  • 7

    这本书错了 . 该标准未指定普通 char 是有符号还是无符号 .

    实际上,该标准定义了三种不同的类型: charsigned charunsigned char . 如果您 #include <limits.h> 然后查看 CHAR_MIN ,您可以看出普通 charsigned 还是 unsigned (如果 CHAR_MIN 小于0或等于0),但即便如此,就标准而言,这三种类型是不同的 .

  • 32

    根据Bjarne Stroustrup的"The C++ Programming Language", char 是"implementation defined" . 根据实施情况,它可以是 signed charunsigned char . 您可以使用 std::numeric_limits<char>::is_signed 检查 char 是否已签名 .

相关问题