从字符串元素奇怪的铸造

时间:2014-09-13 22:04:10

标签: 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());
}

Data I log是: ffffff81 0a 53 3a 30 30 38 31 30 36 43 38

这个ffffff81出现的原因和方式如何?如果string.at应该返回char?

2 个答案:

答案 0 :(得分:3)

当您撰写(unsigned int)data.at(i)时,data.at(i)char,然后提交整数提升。如果在您的系统上对char进行了签名,则大于127的值将被解释为负数。符号位将保留在整数提升中,从而产生如此奇怪的结果。

您可以通过查看numeric_limits<char>::is_signed

来验证字符是否已签名

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

另一种方法是强制编译器使用unsigned chars。例如,使用gcc上的选项-funsigned-char或使用MSVC的/J

答案 1 :(得分:1)

string包含签名字符 因此字符0x81被解释为负数,如0xFFFFFF81 您将此字符转换为unsigned int,因此它变为非常大的数字。