如果我有以下内容,会发生什么类型的转换:
short s = 1234;
char c = s;
首先s
会转换为int
,此int
会转换为char
并分配给c
吗?或者s
会直接转换为char
并分配给c
吗?
答案 0 :(得分:1)
s
未转换为int
。
这里 1 我们正在初始化c
,其值超出char
的范围。普通char
可以是有符号或无符号的(大多数编译器都可以切换到这一点)。如果char
已签名,则相关标准文本位于[conv.integral] / 3中:
如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值是实现定义的。
"实现所定义的"意味着您的编译器必须记录此处发生的事情。现代系统的一个常见实现是,从最重要的一端开始,将截断多余的位。
将代码重写为不依赖于实现定义的行为是一个好主意;这样当你在另一个系统上编译它时,行为就不会改变。
如果char
未签名,则前一段涵盖案例:
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 - 后注]
因此得到的char值为1234 - 1024 = 210
。
1 本文假设您使用的是8位字节的系统。有些专门的芯片并非如此,在这些系统上,char
可以保持1234
的值,只需要更改值。