【问题标题】:casting int to char using C++ style casting [duplicate]使用 C++ 样式转换将 int 转换为 char [重复]
【发布时间】: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; 不用担心哪个演员是哪个演员。当然,如果你这样做了,你就会与那些坚持将编译器警告转化为错误然后在任何发生的地方进行修复的“到处强制转换”的人发生冲突。

标签: c++ casting char int


【解决方案1】:

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

reinterpret_cast 几乎不应该被使用,除非你想将一种类型转换为完全不同的类型。

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

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

【讨论】:

  • 当然,假设有充分的理由不只写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 不能更改类型,只能更改 constvolatile 限定符;
  • reinterpret_cast 用于特殊情况,在指针或引用与完全不相关的类型之间进行转换。具体来说,它不会进行数字转换。
  • C 风格和函数风格的强制转换可以使用 static_castconst_castreinterpret_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 是这里必须使用的那个。请参阅 thisthis 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 正确性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-24
      • 2015-01-20
      • 2015-12-18
      • 2015-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多