【发布时间】:2011-09-29 18:25:30
【问题描述】:
我有一个 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。我已经从这里的各种答案中尝试了几种不同的解决方案,但还没有成功。
以下是我所知道的:
- 我在 OpenVMS 上使用 HP 的 C++ 编译器(我相信使用的是安腾处理器)。
-
sizeof(int)在我的代码将运行的每个架构上至少有 4 个。 - 从数字 > INT_MAX 转换为 int 是实现定义的。在我的机器上,它通常会导致 0,但有趣的是,当值太大时,从
long转换为int会导致INT_MAX。
要正确地做到这一点非常困难,或者至少对我来说是这样。有谁知道对此的便携解决方案?
更新:
将static_cast 更改为reinterpret_cast 会导致编译器错误。一条评论提示我在上面的代码中尝试使用 C 风格的演员表:return (int)val,它成功了。 在这台机器上。在其他架构上仍然安全吗?
【问题讨论】:
-
不能只使用
(int)val吗?但是,“将 val 的类型更改为int也会导致 0....”意味着问题可能来自>>? (我真的不知道,我不使用 C++ ;-) -
有符号整数溢出不是实现定义的,它是未定义的。
-
@derobert,谢谢,我不确定。我知道这不好。相应地更新了问题。
-
如果无符号数不在有符号类型的范围内,则从无符号转换为有符号是实现定义的。
-
@derobert : 这不是有符号溢出,这是整数转换,其结果 是 实现定义的。
标签: c++ casting integer-overflow openvms