繁体   English   中英

从char转换为int

[英]Conversion from char to int

我正在学习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的值,为什么?

在具有8位字符(即大多数字符)的系统上,200超出了范围,因为对char进行了签名,并且您只有7位用于存储值。

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否则,将对新类型进行签名,并且无法在其中表示值; 结果是实现定义的,还是引发实现定义的信号。

因为值200不适合char ,至少在大多数机器上都是这样。 如果char的范围是[-128,127] (通常是这种情况),则当您将200转换为char ,您将获得实现定义的值(甚至可能是信号,但最有可能是-56)。

当然,-56在我所知道的任何编码中都不是合法值,但是大多数输出​​设备会将其视为unsigned char ,其值为200。在某些地方,您需要注意但是; 例如, <cctype>的函数将其参数视为在[0, UCHAR_MAX]范围内[0, UCHAR_MAX]如果将其传递给-56,将导致未定义的行为。

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

unsigned char h = a;

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

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

似乎默认情况下,您的编译器将char类型视为具有char类型的char因为在signed char中不能表示200值,因为char类型的最大值是127因此对应于200的位组合被解释为-56 当将其分配回int类型的对象时,则将-56分配给该值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM