从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
在具有8位字符(即大多数字符)的系统上,200超出范围,因为字符已签名,而您只有7位可存储值。从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否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新
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如果目标类型是有符号的,如果可以,则该值不变
在目标类型(和位字段宽度)中表示;
否则,该值由实现定义
默认情况下,编译器认为typechar
的行为与typesigned 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;