gpt4 book ai didi

c++ - 字符数组到十六进制字符串的转换 - 意外输出

转载 作者:行者123 更新时间:2023-12-03 21:52:08 24 4
gpt4 key购买 nike

我有一个将动态字符数组转换为十六进制字符串表示的简单程序。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
using namespace std;


int main(int argc, char const* argv[]) {
int length = 2;
char *buf = new char[length];
buf[0] = 0xFC;
buf[1] = 0x01;

stringstream ss;
ss << hex << setfill('0');
for(int i = 0; i < length; ++i) {
ss << std::hex << std::setfill('0') << std::setw(2) << (int) buf[i] << " ";
}
string mystr = ss.str();
cout << mystr << endl;
}

输出:

fffffffc 01

预期输出:

fc 01

为什么会这样? fc 之前的那些ffffff 是什么?这仅发生在某些字节上,如您所见,0x01 的格式正确。

最佳答案

要了解正在发生的事情,您需要知道三件事:

  1. 首先,char 可以是有符号的无符号的,它是特定于实现(编译器)的

  2. 当将一个小的有符号类型转换为一个大的有符号类型时(比如一个有符号的 char 到一个 int),它们将被符号扩展

  3. 如何使用最常见的 two's complement 存储负值系统,其中值中的最高位定义值是负数(位已设置)还是非负数(位已清除)

这里发生的是 char 似乎是有符号的,而 0xfc 被认为是一个负值,当你将 0xfc 转换为一个int 符号扩展为0xfffffffc

要解决它,请显式使用 unsigned char 并转换为 unsigned int

关于c++ - 字符数组到十六进制字符串的转换 - 意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59225590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com