【问题标题】:Using char for small integer (C++)将 char 用于小整数 (C++)
【发布时间】:2012-02-21 17:47:59
【问题描述】:

我读到可以将“char”用于小整数。但是,当我尝试时,

unsigned char A = 4;
std::cout << A << std::endl;

它给出一个字符,而不是 4。

【问题讨论】:

  • 你在哪里读到的?无论如何,它应该是 unsigned chat A = '4';它将被存储为一个字符而不是整数
  • Char 被隐式​​用作字符,以防止这种转换为 int:std::cout &lt;&lt; (int)A &lt;&lt; std::endl;
  • @krammer:这取决于他想要什么,你的意思是char不聊天,对吧?
  • @bames53 signed char 通常与char 具有相同的表示形式,它们仍然是不同的类型。
  • @krammer:不,重点是 OP想要 将整数值存储在 char 中,这是完全有效的。

标签: c++ integer char


【解决方案1】:

一个字符一个小整数(范围-127到+127),它和整数一样进行整数运算。

这里的问题是内部表示(表示 -127 到 +127 范围的二进制数)与外部表示之间的概念混淆,这通常使输入和输出函数将其表示为“字形其ASCII码是它携带的数字”,而对于整数,外部表示是“读起来像十进制表示的整数的字符序列”

将其打印为数字的最简单方法是将其转换为 int,然后再将其提供给输出函数(如 cout &lt;&lt; int(ch) 或任何等效的转换形式)

【讨论】:

    【解决方案2】:

    对于单个对象,代码大小的增加可能会淹没存储大小的减少,任何(对齐填充可能需要对象后面的内存)。使用int,除非你需要一个大的小整数数组。

    【讨论】:

      【解决方案3】:

      对于执行字符输出的std::ostream 和(signed/unsigned) char 存在operator&lt;&lt; 的重载;为了输出字符的整数值,您需要执行转换:

      std::cout << (int)A << std::endl;
      

      但是,这就是所谓的“旧式”(更具体地说是 C 式)演员表。 C++ 具有更明确、更易于搜索且通常首选的类型转换运算符:

      std::cout << static_cast<int>(A) << std::endl;
      

      但是这样打字很麻烦;惯用的替代方法是使用 + 运算符,它将其参数提升为 (unsigned) int

      std::cout << +A << std::endl;
      

      这是你应该使用的。

      【讨论】:

        【解决方案4】:

        您正在经历的是运算符重载的影响。 &lt;&lt; 运算符假定当您将一个 char 类型的变量传递给一个字符时,您很可能想要打印一个字符,因此它的行为与您对整数变量的预期不同。

        正如Vivek Goel 所建议的,您可以强制编译器选择您真正想要的重载:

        unsigned char A = 4;
        std::cout << static_cast<unsigned int>(A) << std::endl;
        

        附录:除非您在资源严重受限(尤其是内存很小)的环境中工作,否则您的优化是错误的。 unsigned int 上的操作通常比 unsigned char 上更快,因为您的处理器无法获取单个字节,但必须至少获得 4 的倍数并屏蔽其他 3 个字节。

        【讨论】:

          【解决方案5】:

          应该是

           unsigned char A = 4;
              std::cout << (int)A << std::endl;
          

          【讨论】:

            猜你喜欢
            • 2010-12-23
            • 1970-01-01
            • 1970-01-01
            • 2021-07-04
            • 1970-01-01
            • 1970-01-01
            • 2013-01-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多