C++中十进制转十六进制,如何保留符号扩展的前导位(如额外'f')?
解决C++十进制转十六进制保留全符号扩展位的问题
你的代码输出fffff002是因为用了32位的int类型,负数-4094的补码仅占32位,所以输出只显示这32位的结果。要得到64位的全符号扩展结果(fffffffffffff002),可以按以下方式修改:
核心思路
把数值转换为64位有符号整数类型(比如long long),让系统自动完成符号扩展,再强制输出完整的16位十六进制字符(64位对应16位十六进制)。
修改方案一:直接使用64位变量
将int类型改为long long,同时设置输出格式确保完整显示16位:
#include <iostream> // 输入输出操作头文件 #include <iomanip> // 格式化输出头文件 #include <sstream> // stringstream类型头文件 using namespace std; int main() { long long num; cout << "Please enter number to convert: "; cin >> num; stringstream ss; // 配置十六进制输出、填充字符、固定输出宽度为16 ss << hex << setfill('0') << setw(16) << num; string res(ss.str()); cout << " [Hexadecimal: " << res << "]\n\n"; return 0; }
修改方案二:保留int变量,转换时扩展为64位
如果不想改动变量类型,在写入stringstream时强制将int转为long long即可:
#include <iostream> // 输入输出操作头文件 #include <iomanip> // 格式化输出头文件 #include <sstream> // stringstream类型头文件 using namespace std; int main() { int num; cout << "Please enter number to convert: "; cin >> num; stringstream ss; // 强制转换为long long完成符号扩展,配置输出格式 ss << hex << setfill('0') << setw(16) << static_cast<long long>(num); string res(ss.str()); cout << " [Hexadecimal: " << res << "]\n\n"; return 0; }
关键修改说明
static_cast<long long>(num):把32位int负数转换为64位long long时,系统会自动符号扩展,用'f'填充高位,得到完整的64位补码。setw(16):强制输出16个字符,确保64位整数的十六进制表示不会截断前导的符号位。setfill('0'):指定填充字符,这里因为是负数补码,实际填充的是符号位对应的'f',保证输出长度达标。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

