从char转换为int

时间:2014-10-09 17:39:18

标签: c++ char type-conversion

我正在研究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,为什么?。

4 个答案:

答案 0 :(得分:1)

在具有8位字符(即大多数字符串)的系统上,200超出范围,因为char已签名且您只有7位来存储该值。

答案 1 :(得分:0)

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以外的另一个整数类型时,if   该值可以用新类型表示,不变   2否则,如果新类型是无符号的,则通过重复添加或转换该值   减去一个可以在新类型中表示的最大值   直到该值在新类型的范围内.60)
  3否则,新类型已签名且值无法在其中表示;无论是   结果是实现定义的或引发实现定义的信号。

答案 2 :(得分:0)

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

当然,-56在我所知的任何编码中都不是合法的价值, 但是大多数输出​​设备会把它看作是一个 unsigned char,值为200.有些地方 但是,你必须要注意; <cctype>中的函数, 例如,请求他们的参数在范围内 [0, UCHAR_MAX],如果您将导致未定义的行为 通过他们-56。

答案 3 :(得分:0)

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

unsigned char h = a;

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

  

3如果目标类型已签名,则值可以保持不变   以目的地类型(和位字段宽度)表示;   否则,该值是实现定义的。

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