c++ - 来自字符串元素的奇怪转换

标签 c++ stdstring

我得到应该包含字节(字符数组)的 std:string,我试图显示字节,但第一个字节总是包含奇怪的数据:

4294967169,这怎么会是字节/字符?!

void do_log(const std::string & data) {
std::stringstream ss;

ss<< "do_log: ";

int min = min((data.length()), (20)); // first 20 bytes

for (int i=0;i<min;i++)
{ 
    ss  << setfill ('0') << setw(2) << hex << (unsigned int)data.at(i) <<" ";
}

log(ss.str());
}

我记录的数据是: ffffff81 0a 53 3a 30 30 38 31 30 36 43 38

为什么以及如何出现这个 ffffff81?如果 string.at 应该返回 char?

最佳答案

当你写 (unsigned int)data.at(i) , data.at(i)char然后提交给整数提升。如果在您的系统上 char 是有符号的,则大于 127 的值将被解释为负数。符号位将保留在整数提升中,给出如此奇怪的结果。

您可以通过查看 numeric_limits<char>::is_signed 来验证 char 是否已签名

您可以通过将整数与 0xff 进行与运算来去除整数提升所添加的位,从而轻松解决此问题:(static_cast<int>(data.at(i)) & 0xff)

另一种方法是强制您的编译器使用无符号字符。例如,使用选项 -funsigned-char在 gcc 或 /J 上与MSVC。

关于c++ - 来自字符串元素的奇怪转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25828174/

相关文章:

c++ - std::string::find_first_of 未返回预期值

c++ - 无法从不区分大小写的字符串中提取 double ?

c++ - std::istream 提取设置 failbit 没有明显原因

c++ - 使用 Ivy Bridge 和 Haswell 循环展开以实现最大吞吐量

c++ - 带有 swig 的模块名称

c++ - 如何在 QT 项目的输出构建中包含一个 json 文件

c++ - 自动检测不正确的 find_first_of() 和 family 情况的方法

具有函数声明/原型(prototype)和定义的 C++ 模板

c++ - 为什么std::string的成员运算符=左值引用不合格

c++ - 使用 std::basic_istringstream<unsigned short> 时的 std::bad_cast