之前已经问过类似的问题,我正在使用该问题的解决方案,但它不能100%正常工作。 这是我的代码:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main () {
string hexStr1 = "ffff";
short s1;
stringstream ss1;
ss1 << hex << hexStr1;
ss1 >> s1;
string hexStr2 = "f";
short s2;
stringstream ss2;
ss2 << hex << hexStr2;
ss2 >> s2;
s2 = s2 | -16;
cout << "s1: " << s1 << "\n"; //Outputs 32767 (max short)
cout << "s2: " << s2 << "\n"; //Outputs -1
}
s1
中存储的值不应该是-1
,因为如果一个(2字节)短变量的值为0xffff
,那么它将是负值吗?
我没有看到我如何设置s2与我如何设置s1有什么不同,但结果却不同......
我想将上面的程序打印出来:
s1: -1
s2: -1
有人可以解释为什么程序运行后s1中的值不是-1?
答案 0 :(得分:3)
问题是std::num_get::get()
没有签名的短过载。流提取operator>>(short&)
实际上是从字符串中读取0xffff作为long int,由于潜在的overlfow,未能将值转换为short,指定了std::numeric_limits<short>::max()
的定义值并设置了std::ios_base::failbit
在流上。
有关这种明确定义和预期行为的详细描述,请参见ISO / IEC 14882 [istream.formatted.arithmetic] / 2。
答案 1 :(得分:1)
最有可能的问题是
ss1 >> hex >> s1;
失败。它适合我。
更新代码以添加支票。
if ( !(ss1 >> hex >> s1) )
{
cout << "Unable to read s1\n";
}
如果读入s1
失败,在将其设置为有效值之前依赖其值是没有意义的。