本问题已经有最佳答案,请猛点这里访问。
在传统的C语言中,您可以做到:
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)适合于完成这项工作?
你也可以做char c = i;,不用担心哪种类型的演员。当然,如果你这样做,你会遇到一些"到处施放"的人,他们坚持编译器警告会变成错误,然后在出现错误的地方进行修复。
您应该使用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/。
当然,假设有一个很好的理由不只是写char c = '0'…
@无用,它的含义与从int中强制转换完全不同,您将它设置为与数字0不同的字符"0"。
但与问题中的整型文字48相同,假定使用ASCII编码。我对硬编码的ASCII整型值过敏,因为字符文本的可读性更高。
另外,reinterpret_cast根本无法在整数类型之间转换;因此,是否"应该"使用它是不相关的。
@没用,这只是一个例子,在我的例子中,我没有硬编码的这个数字,我有一个枚举,我需要插入到一个字符中,我知道我不会超过255。不过谢谢。
您可以在数值类型之间隐式转换,即使这样会降低精度:
char c = i;
但是,您可能希望启用编译器警告以避免这样可能的有损转换。如果是这样,则使用static_cast进行转换。
其他演员:
dynamic_cast只适用于指针或对多态类类型的引用;
const_cast不能改变类型,只有const或volatile限定符;
reinterpret_cast用于特殊情况,在指针或引用和完全无关的类型之间转换。具体来说,它不会进行数值转换。
C样式和功能样式的强制转换可以执行static_cast、const_cast和reinterpret_cast的任何组合以完成任务。
埃多克斯1〔3〕
reinterpret_cast不能用于此转换,代码将无法编译。根据C++ 03标准部分5.2.10-1:
埃多克斯1〔15〕
该部分未列出此转换。即使这是无效的:
long l = reinterpret_cast(i)
。
static_cast是这里必须使用的。看看这个和这个问题。
使用静态强制转换可能会导致如下结果:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
号
要防止可能的类型溢出,可以执行以下操作:
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正确性。