【问题标题】:Conversion from char to int从 char 到 int 的转换
【发布时间】:2014-12-04 18:04:10
【问题描述】:

我正在学习 C++ 语言三周,我在从 char 转换为 int 时遇到问题。如果我编写这个程序:

int main()
{
  int a = 200; 
  char h = a; 
  int b = h;
  cout << h << "\n"; 
  cout << b << "\n"; 

  keep_window_open();
  return 0;
}

如果我将 a 的值转换为 char,h 的值将成为 ASCII 表中的一个字符,但如果我将 h 值转换回 int,我不会得到值 200,为什么?。

【问题讨论】:

  • 您系统的char 必须默认为已签名。
  • 您在这里使用哪种编译器和架构?

标签: c++ char type-conversion


【解决方案1】:

在具有 8 位字符(即大多数字符)的系统上,200 超出范围,因为 char 是有符号的,而您只有 7 位来存储值。

【讨论】:

  • 我相信它是由实现定义的 char 默认为有符号还是无符号。
  • @TimoGeusch 那么为什么如果我打印出正确值的 char 变量的值呢?
  • char 可能等同于signed charunsigned char。从历史上看,大多数(但不是全部)具有 8 位 char 和 2 的补码的机器使其签名;大多数其他人将其设为无符号(这对于文本来说更合乎逻辑)。今天,大多数编译器都有一个选项,因此您可以选择:/J 用于 MSC,-funsigned-char 用于 g++ 等)
【解决方案2】:

因为200 的值不适合char,至少在 大多数机器。如果char 的范围是[-128,127] (通常是这种情况),当您将200 转换为char 时,您会得到 一个实现定义的值(甚至可以是一个信号, 但很可能是 -56)。

当然,-56 在我所知道的任何编码中都不是合法值, 但大多数输出​​设备会将其视为 unsigned char,值为200。有的地方 但是,您必须注意; &lt;cctype&gt; 中的函数, 例如,期望他们的论点在范围内 [0, UCHAR_MAX],如果你 通过他们-56。

【讨论】:

    【解决方案3】:

    char 可以签名或未签名,执行必须记录哪个(您的已签名)。
    大小也是实现定义的(ID)(你的是 8 位的,很常见)。

    此外,转换被定义为尽可能保值。

    所以:

    200 (int)
    -56 (char) ID as not in range for char and char is signed
    -56 (int) value-preserving widening conversion
    

    是你的转化顺序。

    6.3.1.3 有符号和无符号整数

    1 当整数类型的值转换为_Bool以外的其他整数类型时,如果 该值可以用新类型表示,它是不变的。
    2 否则,如果新类型是无符号的,则通过重复添加或转换值 比新类型可以表示的最大值减一 直到值在新类型的范围内。60)
    3 否则,新类型是有符号的,值不能在其中表示;无论是 结果是实现定义的或引发了实现定义的信号。

    【讨论】:

      【解决方案4】:

      如果您想获得相同的值,您必须使用unsigned char。例如

      unsigned char h = a;
      

      根据 C++ 标准(4.7 积分转换)

      3 如果目标类型是有符号的,如果可以,值不变 以目标类型(和位域宽度)表示; 否则,该值是实现定义的。

      似乎默认情况下,您的编译器将char 类型视为signed char 类型的行为值200 不能用signed char 表示,因为类型signed char 的最大值是127,因此对应于的位组合200 被解释为有符号数-56。当它被分配回一个 int 类型的对象时,这个值为 -56 被分配给。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-18
        • 2014-05-04
        • 1970-01-01
        • 1970-01-01
        • 2019-09-22
        • 2020-06-20
        • 1970-01-01
        相关资源
        最近更新 更多