c++ - 如何在 unsigned int 和 int 之间安全地进行 static_cast?

标签 c++ casting integer-overflow openvms

我有一个 8 字符的 string 表示一个十六进制数,我需要将它转换为一个 int。此转换必须保留字符串 "80000000" 及更高版本的位模式,即这些数字应为负数。不幸的是,天真的解决方案:

int hex_str_to_int(const string hexStr)
{    
    stringstream strm;
    strm << hex << hexStr;
    unsigned int val = 0;
    strm >> val;
    return static_cast<int>(val);
}

如果 val > MAX_INT(返回值为 0),则对我的编译器不起作用。将 val 的类型更改为 int 也会导致较大数字为 0。我已经尝试了 SO 上各种答案的几种不同解决方案,但尚未成功。

这是我所知道的:

  • 我在 OpenVMS 上使用 HP 的 C++ 编译器(我相信使用 Itanium 处理器)。
  • sizeof(int) 在我的代码运行的每个架构上至少为 4。
  • 从数字 > INT_MAX 到 int 的转换是实现定义的。在我的机器上,它通常会导致 0,但有趣的是,当值太大时,从 long 转换为 int 会导致 INT_MAX。<

要正确地做到这一点出奇地困难,或者至少对我来说是这样。有谁知道对此的可移植解决方案?

更新:

static_cast 更改为 reinterpret_cast 会导致编译器错误。一条评论提示我在上面的代码中尝试 C 风格的强制转换:return (int)val,并且成功了。 在这台机器上。在其他架构上仍然安全吗?

最佳答案

引用 C++03 标准,§4.7/3(积分转换):

If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

因为结果是实现定义的,根据定义不可能有真正可移植的解决方案。

关于c++ - 如何在 unsigned int 和 int 之间安全地进行 static_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601731/

相关文章:

c++ - 无法理解这个 c++ typedef

c++ - 通过 C 强制转换访问结构的第一个字段是否违反了严格的别名?

c++ - 类的成员字段顺序是 "stable"吗?

c++ - 哪种转换是从 Type* 到 void*?

algorithm - 自定义溢出检测

c++ - 拦截 Windows 文件系统,编辑数据?

c++ - 求和、平均值、最小值、最大值和负值的总数

Angular 9 变量未在 View 中更新

c++ - 防止用户输入会导致整数溢出的值

llvm - LLVM 的整数溢出捕获?