使用 C++ 样式转换将 int 转换为 char [重复]
Posted
技术标签:
【中文标题】使用 C++ 样式转换将 int 转换为 char [重复]【英文标题】:casting int to char using C++ style casting [duplicate] 【发布时间】:2013-05-29 17:46:28 【问题描述】:在传统的 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++ 转换方法(static_cast、reinterpret_cast)适合完成这项工作?
【问题讨论】:
你也可以char c = i;
不用担心哪个演员是哪个演员。当然,如果你这样做了,你就会与那些坚持将编译器警告转化为错误然后在任何发生的地方进行修复的“到处强制转换”的人发生冲突。
【参考方案1】:
您应该使用static_cast<char>(i)
将整数i
转换为char
。
reinterpret_cast
几乎不应该被使用,除非你想将一种类型转换为完全不同的类型。
另外,reinterpret_cast
依赖于机器,因此安全地使用它需要完全了解类型以及编译器如何实现转换。
有关 C++ 转换的更多信息,请参阅:
When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used? http://www.cplusplus.com/doc/tutorial/typecasting/。【讨论】:
当然,假设有充分的理由不只写char c = '0'
...
@Useless 这和从int中强制转换的意思完全不同,你将它设置为字符'0',它与数字0不同。
但与问题中的整数文字 48
相同,假设为 ASCII 编码。我对硬编码 ASCII 整数值过敏,因为字符文字无论如何都更具可读性。
另外,reinterpret_cast
根本无法在整数类型之间进行转换;所以你是否“应该”使用它是无关紧要的。
@Useless,这只是一个例子,在我的情况下,我没有硬编码这个数字,我有一个需要插入 char 的枚举,我知道我不会达到超过 255。不过,谢谢。【参考方案2】:
您可以在数值类型之间进行隐式转换,即使这样会丢失精度:
char c = i;
但是,您可能希望启用编译器警告以避免此类潜在的有损转换。如果您这样做,请使用static_cast
进行转换。
其他演员:
dynamic_cast
仅适用于多态类类型的指针或引用;
const_cast
不能更改类型,只能更改 const
或 volatile
限定符;
reinterpret_cast
用于特殊情况,在指针或引用与完全不相关的类型之间进行转换。具体来说,它不会进行数字转换。
C 风格和函数风格的强制转换可以使用 static_cast
、const_cast
和 reinterpret_cast
的任意组合来完成工作。
【讨论】:
char c = static_cast<char>(i);
【参考方案3】:
reinterpret_cast
不能用于此转换,代码将无法编译。根据 C++03 标准第 5.2.10-1 节:
Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.
此转换未在该部分中列出。即使这是无效的:
long l = reinterpret_cast<long>(i)
static_cast
是这里必须使用的那个。请参阅 this 和 this SO 问题。
【讨论】:
【参考方案4】:使用静态转换可能会导致如下结果:
// 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.
reinterpret_cast 可能只是直接转换为 char,没有任何强制转换安全性。 -> 如果你也可以使用 static_cast,就不要使用 reinterpret_cast。 如果您在类之间进行转换,static_cast 还将确保两种类型匹配(对象是转换类型的派生)。
如果您的对象是多态类型并且您不知道它是哪一个,您应该使用 dynamic_cast,它会在运行时执行类型检查,如果类型不匹配则返回 nullptr。
如果你需要 const_cast,你很可能做错了什么,应该考虑可能的替代方法来修复代码中的 const 正确性。
【讨论】:
以上是关于使用 C++ 样式转换将 int 转换为 char [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 C++ 中使用 atoi 将 char 数组转换为 int 值