对于无符号字符,boost::lexical_cast 和 std::to_string 的正确结果是什么

What's the correct result of boost::lexical_cast and std::to_string for unsigned char

本文关键字:string to 是什么 结果是 结果 std cast 字符 无符号 boost lexical      更新时间:2023-10-16

下面从char到string的正确结果是什么?

我听说旧的boost版本1.46 lexical_cast输出是56,我没有那个版本在我附近,我不能测试它。但boost库(1.49)输出为:8

  unsigned char c= 56;
  std::string s = boost::lexical_cast<std::string>(c);
  std::cout << "boost::lexical_cast: " << s << std::endl;

c++ 11 to_string输出为:56

  std::cout << "std::to_string: " << std::to_string(c) << std::endl;

std::to_string只提供数值类型的重载,在这种情况下可能解析为unsigned版本。lexical_cast, OTOH,依赖于std::ostream::operator<<进行转换,因此将c视为字符。

都是正确的。to_string不关心c是否为char类型,它将读取其中的数字并将其转换为string。

另一方面,lexical_cast<std::string>似乎将char类型的变量解释为ascii值。

旧的boost版本不正确。

lexical_cast的结果应该与流到ostream的结果相同。所以

的结果
std::cout << boost::lexical_cast<std::string>(x)

等于

std::cout << x

对于unsigned char,这意味着将x解释为ASCII码,对于其他整数类型,它将给出与itoa相同的结果。这是因为char类型不被ostream视为算术整数(参见§27.3.6.2和§27.3.6.4)。这种方法的优点是,您可以通过输出单个字符来输出字符串。如果需要实际的数值,可以将该字符强制转换为算术类型以输出。

另一方面,

to_stringitoa一样适用于所有整数数据类型,因为它没有unsigned char的重载。这里的基本原理是,通过调用to_string,您已经表达了执行转换的意图,即您对值的字符类型质量(这将是默认的)不感兴趣,而是对算术类型质量感兴趣。

这是一个解释问题。如果您将char解释为一个小整数,则在当前字符集中打印其代码;这是to_string似乎正在做的。

如果您将其解释为要打印的字符,则发出相应的字符,即8boost::lexical_cast一样。

这不是char到string,而是"unsigned char"到string。他们都是正确的。Lexical_cast使用stringstream实例进行转换,而std::to_string被重载为unsigned,这意味着unsigned char被提升为unsigned int。