代码之家  ›  专栏  ›  技术社区  ›  Adam Naylor

有人能解释char的签名是如何特定于平台的吗?

  •  10
  • Adam Naylor  · 技术社区  · 17 年前

    我最近读到

    char
    unsigned char
    

    和

    signed char
    

    是平台特定的。
    我不能完全理解这个问题吗?这是否意味着位序列可以在不同的平台之间变化?符号是第一位,平台是符号可能在末尾?你将如何对此进行编码?

    基本上,我的问题来自于看到这一行:

    typedef unsigned char byte;
    

    我不明白标牌的相关性?

    6 回复  |  直到 13 年前
        1
  •  17
  •   Rob Kennedy    13 年前

    假设您的平台有8位字节,假设我们有位模式 10101010 . 到A signed char ,该值为−86。为了 unsigned char 不过,相同的位模式表示170。我们没有移动任何位;它是相同的位,解释了两种不同的方式。

    现在 char . 标准没有说明这两种解释中哪一种应该是正确的。一 烧焦 保持钻头模式 一千零一十万一千零一十 可以是 任何一个 86 或 170.它将是这两个值中的一个,但是您必须先了解编译器和平台,然后才能预测它是什么。一些编译器提供了一个命令行开关来控制它是哪个。有些编译器根据运行的操作系统有不同的默认值,因此它们可以与操作系统约定相匹配。

    在大多数代码中,这真的不重要。为了实现重载,它们被视为三种不同的类型。指向这些类型之一的指针与指向其他类型的指针不兼容。尝试呼叫 strlen 用一个 signed char* 或 unsigned char* 不起作用。

    使用 符号字符 当需要一个单字节带符号的数字类型时,并使用 无符号字符 当需要单字节无符号数字类型时。用朴素的旧 烧焦 当你想保留字符时。这就是程序员在写你要问的typedef时的想法。名称“byte”没有保留字符数据的含义,而名称“unsigned char”在其名称中包含单词“char”,这使一些人认为它是保存字符的好类型,或者将其与类型变量进行比较是个好主意。 烧焦 .

    既然你不太可能对字符做一般的算术运算,那就不重要了 烧焦 在您使用的任何平台和编译器上签名或未签名。

        2
  •  15
  •   Tadeusz Kopec for Ukraine yespbs    17 年前

    你误解了什么。签名字符总是签名的。无符号字符总是无符号的。但是,纯字符是有符号的还是无符号的是特定于实现的——这意味着它取决于编译器。这与int类型不同,所有类型都有符号(int与signed int相同,short与signed short相同)。更有趣的是,char、signed char和unsigned char在函数重载方面被视为三种不同的类型。这意味着您可以在同一编译单元中有三个函数重载:

    void overload(char);
    void overload(signed char);
    void overload(unsigned char);
    

    因为int类型是相反的,所以不能

    void overload(int);
    void overload(signed int);
    

    因为int和有符号int是相同的。

        3
  •  3
  •   Jonathan Leffler    17 年前

    更正确的说法是,它是特定于编译器的,您不应该指望 char 使用时签名或未签名 烧焦 没有 signed 或 unsigned 限定符。

    否则,您将面临以下问题:假设您编写和调试程序 烧焦 默认情况下是签名的,然后用编译器重新编译,否则程序行为会发生剧烈变化。如果在代码中每隔一段时间仅依赖于此假设,那么在某些情况下,您可能会面临意外行为的风险,这些行为仅在特定条件下在程序中触发,并且很难检测和调试。

        4
  •  2
  •   Karl Voigtland    17 年前

    也许你指的是这样一个事实 char 编译器/平台特定。以下是一篇博文,可以让你对它有所了解:

    Character types in C and C++

        5
  •  0
  •   ewanm89    17 年前

    有符号字符更像是在C中处理所有基变量类型的一个侥幸,一般来说,使用负字符实际上并不有用。

        6
  •  -4
  •   Toad    17 年前

    有符号字符总是8位的,并且总是有符号位作为最后一位。

    无符号字符总是8位,没有符号位。

    据我所知,char总是无符号的。任何默认为有符号字符的编译器都将面临许多不兼容的程序。

    推荐文章