我有一个包含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结果。 我已经尝试了来自stackoverflow各种答案的不同解决方案,但仍未成功。
以下是我所知道的:
- 我在OpenVMS上使用HP的C ++编译器(我相信使用Itanium处理器)。
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++ ;-) - user166390