使用C ++样式转换将int转换为char

casting int to char using C++ style casting

本问题已经有最佳答案,请猛点这里访问。

在传统的C语言中,您可以做到:

1
2
3
4
int i = 48;
char c = (char)i;
//Now c holds the value of 48.
//(Of course if i > 255 then c will not hold the same value as i).

C++中的哪种方法(StasyQuestCase,RealType CAST)适合于完成这项工作?


您应该使用static_cast(i)将整数i转换为char

除非您想将一个类型转换成一个根本不同的类型,否则几乎不应该使用reinterpret_cast

另外,reinterpret_cast依赖于机器,因此安全地使用它需要完全理解类型以及编译器如何实现强制转换。

有关C++铸件的更多信息,请参见:

  • 什么时候应该使用静态u cast、动态u cast、const u cast和reinterpret u cast?
  • http://www.cplusplus.com/doc/tutorial/typecasting/。


您可以在数值类型之间隐式转换,即使这样会降低精度:

1
char c = i;

但是,您可能希望启用编译器警告以避免这样可能的有损转换。如果是这样,则使用static_cast进行转换。

其他演员:

  • dynamic_cast只适用于指针或对多态类类型的引用;
  • const_cast不能改变类型,只有constvolatile限定符;
  • reinterpret_cast用于特殊情况,在指针或引用和完全无关的类型之间转换。具体来说,它不会进行数值转换。
  • C样式和功能样式的强制转换可以执行static_castconst_castreinterpret_cast的任何组合以完成任务。


reinterpret_cast不能用于此转换,代码将无法编译。根据C++ 03标准部分5.2.10-1:

埃多克斯1〔15〕

该部分未列出此转换。即使这是无效的:

1
long l = reinterpret_cast<long>(i)

static_cast是这里必须使用的。看看这个和这个问题。


使用静态强制转换可能会导致如下结果:

1
2
3
4
5
// This does not prevent a possible type overflow
const char char_max = -1;

int i = 48;
char c = (i & char_max);

要防止可能的类型溢出,可以执行以下操作:

1
2
3
4
const char char_max = (char)(((unsigned char) char(-1)) / 2);

int i = 128;
char c = (i & char_max); // Would always result in positive signed values.

如果重新解释,那么Cast可能会直接转换为char,而没有任何Cast安全性。->如果你也可以使用静态模式,就不要使用reinterpret-cast。如果在类之间进行强制转换,静态强制转换还将确保两种类型匹配(对象是强制转换类型的派生)。

如果您的对象是一个多态类型,而您不知道它是哪个类型,那么您应该使用动态类型转换,动态类型转换将在运行时执行类型检查,如果类型不匹配,则返回nullptr。

如果您需要const-cast,那么您很可能做了一些错误的事情,应该考虑可能的替代方法来修复代码中的const正确性。