我正在研究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,为什么?。
答案 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这个值。