将字符串中以十六进制形式存储的负长整型值转换为 C++ 中的长整型变量

Converting a negative long value stored in hex in a string to a long variable in C++

本文关键字:转换 C++ 整型变量 长整型 十六进制 存储 字符串      更新时间:2023-10-16

我正在尝试将十六进制的字符串流转换为长字符串流。我来这里寻求帮助,他们给出的解决方案(适用于短头、整数和大多数多头(不适用于需要至少 16 个十六进制数字来表示的负多头。

基本上我有一个名为hx的字符串流,我在其中填充了应该等于-9223372036854775808的十六进制数字。

#include <iostream>
#include <sstream>
#include <climits>
using namespace std;
int main() {
stringstream hx;
hx << hex << LONG_MIN;
cout << hx.str() << 'n';
long value;
hx >> value;
cout << value << 'n';
return 0;
}

实际输出:

8000000000000000
9223372036854775807

预期输出:

8000000000000000
-9223372036854775808

我不明白为什么当符号位为 1 时十六进制值转换为正数。

首先,hx << hex << LONG_MIN将隐式使用printf("%lx", ...)来打印值,这会导致未定义的行为,因为LONG_MIN不属于unsigned long类型。

其次,假设hx.str()现在存储字符串8000000000000000。为了输入value,它被解释为一个大的数。结果,std::numeric_limits<long>::max(),即9223372036854775807存储在value中。

这是其他答案中解释的解决方案和推理 hx <<十六进制<<LONG_MIN将隐式使用 printf("%lx", ...( 类型为无符号长:

int main() {
stringstream hx;
hx <<hex << (LONG_MIN);
cout << hx.str() << 'n';
unsigned long value;
hx >> value;
cout << static_cast<long>( value ) << 'n';
return 0;
}