使用C++样式强制类型转换将int转换为char

45

在传统的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; 而不必担心哪个转换是哪个。当然,如果你这样做,你会遭到“到处转换”的人们的反对,他们坚持将编译器警告转化为错误,并在出现问题时进行修复。 - Pete Becker
4个回答

39

您可以在数字类型之间进行隐式转换,即使这会失去精度:

char c = i;

然而,您可能希望启用编译器警告以避免类似于此的可能有损失的转换。如果是这样,请使用 static_cast 进行转换。

关于其他类型的转换:

  • dynamic_cast 仅适用于指向多态类类型的指针或引用;
  • const_cast 不能更改类型,只能更改 constvolatile 限定符;
  • reinterpret_cast 用于特殊情况,将指针或引用与完全不相关的类型进行转换。具体来说,它不会进行数字转换。
  • C风格和函数风格的转换执行任何组合的 static_castconst_castreinterpret_cast 来完成任务。

16
char c = static_cast<char>(i); - kayleeFrye_onDeck

36

您应该使用 static_cast<char>(i) 将整数 i 强制转换为字符 char

reinterpret_cast 几乎永远不应该使用,除非您想将一个类型转换为根本不同的类型。

此外,reinterpret_cast 是与机器相关的,因此安全地使用它需要完全了解类型以及编译器如何实现转换。

有关C++转换的更多信息,请参见:


当然,如果没有很好的理由,就不要只写char c = '0'... - Useless
@Useless 这个意思与将其从int转换的意思完全不同,你将它设置为字符'0',这与数字0不同。 - Kevin
3
与问题中的整数文字48相同,假设使用ASCII编码。我对硬编码ASCII整数值过敏,因为字符文字本来更易读。 - Useless
另外,reinterpret_cast根本无法在整数类型之间进行转换;因此,你是否应该使用它是无关紧要的。 - Mike Seymour
@Useless,这只是一个例子,在我的情况下,我没有硬编码这个数字,我有一个枚举需要插入到一个字符中,我知道我不会超过255。谢谢。 - Subway

0

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

可以使用 reinterpret_cast 显式执行的转换如下所示。不能使用 reinterpret_cast 显式执行其他转换。

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

long l = reinterpret_cast<long>(i)

static_cast 是这里必须使用的。请参见thisthis的SO问题。


-1

使用静态转换可能会得到类似这样的结果:

// 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 正确性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接