3

我猜 C 只是一个重新解释的演员,位模式保持原样。

我试图了解当我将更广泛的有符号值转换为更窄的有符号值时会发生什么。是否保留符号,或者只是将较窄宽度中的值解释为有符号值。

感谢您的任何帮助。

编辑——这是针对 C99 编译的 c 代码。问题不在于 C++ 编译器将如何处理草率的旧样式转换,而是是否有任何关于 C 做什么的定义。

4

3 回答 3

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 类型转换在 C++ 中的作用与它们在 C 中的作用相同。这意味着 C 中的类型转换实际上会根据类型转换做不同的事情。

于 2013-04-18T16:32:23.140 回答
4

没有等效的演员表。

C 强制转换可以像所有 C++ 强制转换一样运行(除了dynamic_cast)。

于 2013-04-18T16:29:28.110 回答
2

C 强制转换最终会导致 C++ 强制转换(除了dynamic_cast)。这是第一个成功的演员表:

  • const_cast
  • static_cast
  • static_cast,然后是 const_cast
  • reinterpret_cast
  • 重新解释_cast,然后是 const_cast
于 2013-04-18T16:31:44.507 回答