【问题标题】:3.9.1 Fundamental types3.9.1 基本类型
【发布时间】:2010-09-01 13:17:10
【问题描述】:

C++ 标准 §3.9.1 基本类型

声明为字符(char)的对象 应足够大以存储任何 实施的基本成员 字符集。如果一个字符来自 这个集合存储在一个字符中 对象,它的整数值 字符对象等于值 单字符文字形式的 那个性格的。这是 实现定义是否为 char 对象可以保存负值。 字符可以显式声明 未签名或签名。普通字符,签名 char 和 unsigned char 是三个 不同的类型。<...>

我无法理解 unsigned char。

数字可以是 +1 或 -1。

我无法以类似的方式思考 -A 和 +A。

引入无符号字符的历史原因是什么。

【问题讨论】:

    标签: c++


    【解决方案1】:

    char 实际上是一个整数类型。只是类型也用于表示字符。既然是整型,谈有符号是有道理的。

    (具体历史原因我不清楚。可能是为了保存byte的关键字,将其与char混为一谈。)

    【讨论】:

    • 它不直接来自文本。你有资源吗?我理解这个论点,它可能是正确的。只是为了确定?!
    • 读者注意到没有标志限定符的“普通”char 的签名是实现定义的。
    【解决方案2】:

    在 C(以及 C++)中,char 不代表字符。它表示一个字节 (int_least8_t)。这是 Unicode 之前的历史遗留问题,当时一个字符实际上可以适合 char,但现在是语言中的一个缺陷。

    由于char 确实是一个小整数,因此具有signed charunsigned char 是有意义的。实际上存在三种不同的char 类型:charsigned charunsigned char。一个常见的约定是 unsigned char 代表字节,而普通的 char 代表 characters UTF-8 代码单元。

    【讨论】:

      【解决方案3】:

      计算机不“理解”字母或字符的概念;他们只对数字起作用。所以一群人聚在一起,就什么数字对应什么字母达成了一致。最常用的一种是 ASCII(尽管该语言不保证这一点)。

      在 ASCII 中,字母 A 的代码为 65。在使用 ASCII 的环境中,字母 A 将由数字 65 表示。

      char 数据类型也用作整数类型 - 这意味着它只能包含数字,因此允许使用 unsignedsigned。在我见过的大多数平台上,char 是一个 8 位字节。

      【讨论】:

      • 这如何解释无符号和有符号?
      • 因为符号是数字的相关概念。
      【解决方案4】:

      你读得太多了。字符是可以容纳字符的小型整数类型。故事结局。 Unsigned char 从未被引入或打算使用,它就是这样,因为 char 是与 int 或 long 或 short 相同的整数类型,只是大小不同。事实上,几乎没有理由使用 unsigned char,但是如果人们想要单字节的 unsigned 整数存储,就会这样做。

      【讨论】:

      • A char 一个可以容纳一个字符的小整数类型。
      • "几乎没有理由使用 unsigned char" - 好吧,我不会对使用各种类型/起源的字节结构和/或 @ 987654322@ 的独特属性重新别名 - 其中unsigned char 构成 99% 的此类代码库。
      【解决方案5】:

      如果你想要一个小的内存占用并且想要存储一个数字而不是有符号和无符号字符是有用的。

      如果要使用 128-255 之间的值,则需要无符号字符

      unsigned char score = 232;
      

      如果你想存储两个字符之间的差异,签名字符是有用的。

      signed char diff = 'D' - 'A';
      

      char 与其他两个不同,因为你不能假设它也是。

      【讨论】:

        【解决方案6】:

        你可以使用从 255 到 0 的溢出吗? (我不知道。只是猜测)

        也许不仅仅是字符,还有 -128 到 127 和 0 到 255 之间的数字。

        【讨论】:

          【解决方案7】:

          想想 ASCII 字符集。

          从历史上看,计算中用于文本的所有字符都是由 ASCII 字符集定义的。每个字符由一个 8 位字节表示,它是无符号的,因此每个字符都有一个 0 - 255 范围内的值。

          为了编码,单词字符被简化为字符。

          8 位字符使用与 8 位字节相同的内存,因此就编译器而言它们是可互换的。

          当应用于字节或字符时,编译器指令无符号(默认情况下所有数字都被签名,因为二进制补码用于表示二进制中的负数)强制它们具有 0-255 范围内的值。

          如果无符号,则其值为 -128 - +127。

          如今随着 UNICODE 和多字节字符集的出现,字节和字符之间的这种关系不再存在。

          【讨论】:

          • 其实混淆可以追溯到字节是8位的,但是ASCII只定义了[0-127]。范围 [-128, 127] 和 [0,255] 都是 ASCII 的超集。因此,您可以说 ASCII 保留了两个选项。
          • 是的 - 我在考虑一个扩展版本,例如旧的 MS-DOS 代码页 437。
          猜你喜欢
          • 1970-01-01
          • 2013-04-05
          • 1970-01-01
          • 1970-01-01
          • 2021-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-06
          相关资源
          最近更新 更多