[英]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.