我猜C只是一个重新解释,并且位模式保持不变。
我试图了解当我将更宽的有符号值转换为更窄的有符号值时会发生什么。是保留符号,还是只是将较窄宽度中的值解释为有符号值。
感谢您的帮助。
编辑 - 这是针对C99编译的c代码。问题不在于c ++编译器会用粗糙的旧样式转换,而是如果有什么定义C的作用。
答案 0 :(得分:6)
如果你只关心C,你真的不需要问C ++,但在你的例子中,C ++和C仍然大致相同;
C ++谈到了这些完整的转换:
如果目标类型已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值是实现定义的。
C99说这些积分转换:
否则,新类型已签名且值无法在其中表示;无论是 结果是实现定义的或引发实现定义的信号。
如果可能,将较大的整数值转换为较小的有符号整数值将产生相同的值,否则将给出实现定义(即非可移植)行为。
§5.4/ 4州
执行的转化
- 一个const_cast(5.2.11),
- 一个static_cast(5.2.9),
- 一个static_cast,后跟一个const_cast,
- reinterpret_cast(5.2.10)或
- 一个reinterpret_cast,然后是一个const_cast,
可以使用显式类型转换的强制转换表示法执行。
[...]
如果转换可以用上面列出的多种方式解释,则解释为 出现在列表中的第一个,即使由该解释产生的演员表格格式不正确。
定义C ++使其与C兼容;也就是说,C casts在C ++中会像在C中那样做同样的事情。这意味着C语言中的强制转换符号实际上根据所投射的类型做了不同的事情。
答案 1 :(得分:4)
没有等效演员。
C cast可以像所有C ++强制转换一样运行(dynamic_cast
除外)。
答案 2 :(得分:2)
C cast最终会导致C ++演员表({{1}}除外)。这是第一次在-st:
中取得成功