gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:55:12 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com