当我为char分配短片时会发生什么类型的转换?

时间:2015-01-28 00:06:05

标签: c++ types casting

如果我有以下内容,会发生什么类型的转换:

short s = 1234;
char c = s;

首先s会转换为int,此int会转换为char并分配给c吗?或者s会直接转换为char并分配给c吗?

1 个答案:

答案 0 :(得分:1)

s未转换为int

这里 1 我们正在初始化c,其值超出char的范围。普通char可以是有符号或无符号的(大多数编译器都可以切换到这一点)。如果char已签名,则相关标准文本位于[conv.integral] / 3中:

  

如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值是实现定义的。

"实现所定义的"意味着您的编译器必须记录此处发生的事情。现代系统的一个常见实现是,从最重要的一端开始,将截断多余的位。

将代码重写为不依赖于实现定义的行为是一个好主意;这样当你在另一个系统上编译它时,行为就不会改变。

如果char未签名,则前一段涵盖案例:

  

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 - 后注]

因此得到的char值为1234 - 1024 = 210


1 本文假设您使用的是8位字节的系统。有些专门的芯片并非如此,在这些系统上,char可以保持1234的值,只需要更改值。