You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 10:25:39