从char到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; } intmain() { INTA=200; charh=a; int b=h; cout

从char到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; } intmain() { INTA=200; charh=a; int b=h; cout,c++,char,type-conversion,C++,Char,Type Conversion,在具有8位字符(即大多数字符)的系统上,200超出范围,因为字符已签名,而您只有7位可存储值。char可以签名或未签名,实现必须记录哪个(您的)已签名。 大小也是实现定义的(ID)(您的是8位,非常常见) 此外,在可能的情况下,转换被定义为保值的 因此: 是您的转换顺序 6.3.1.3有符号和无符号整数 1当整数类型的值转换为除\u Bool以外的其他整数类型时,如果 该值可以用新类型表示,但不变。 2否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新

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

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

此外,在可能的情况下,转换被定义为保值的

因此:

是您的转换顺序

6.3.1.3有符号和无符号整数 1当整数类型的值转换为除
\u Bool
以外的其他整数类型时,如果 该值可以用新类型表示,但不变。
2否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内。60)
3否则,新类型将被签名,并且无法在其中表示值;或者 结果是定义了实现或发出了定义了实现的信号


因为值
200
不适合
char
,至少在 大多数机器。如果
字符的范围是
[-128127]
(通常情况下),当您将
200
转换为
char
时 实现定义的值(甚至可以是信号, 但最有可能的是-56)

当然,-56在我所知道的任何编码中都不是合法的值, 但大多数输出设备都会将其视为
无符号字符
,值为200。有些地方 但是,您必须注意,
中的函数, 例如,将其参数设置为在范围内
[0,UCHAR\u MAX]
,如果您
传递它们-56。

如果要获得相同的值,必须使用
无符号字符

unsigned char h = a;

根据C++标准(4.7积分转换)< /P> 3如果目标类型是有符号的,如果可以,则该值不变 在目标类型(和位字段宽度)中表示; 否则,该值由实现定义


默认情况下,编译器认为type
char
的行为与type
signed char
Value 200不能用signed char表示,因为type signed char的最大值是
127
,因此当它是assi时,对应于200的位组合被解释为signed number
-56
返回int类型的对象,然后将该值赋值为-56。

您系统的
char
必须默认为signed。您在这里使用的编译器和体系结构是什么?我相信
char
默认为signed还是unsigned是由实现定义的。@TimoGeusch那么,如果我打印char变量的值,为什么这是正确的值?
char
可能相当于
signed char
unsigned char
。从历史上看,大多数(但不是所有)具有8位
char
和2的补码的机器都使其具有符号;大多数其他机器使其具有无符号(这对于文本来说更符合逻辑)。现在,大多数编译器都有一个选项,因此您可以选择:
/J
用于MSC,
-funsigned char
用于g++,等等。)
unsigned char h = a;