对于unsigned char,boost :: lexical_cast和std :: to_string的正确结果是什么?

时间:2013-06-05 10:17:59

标签: c++ c++11

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

我听说旧的提升版 1.46 lexical_cast输出 56 ,我附近没有那个我无法测试它的版本。但 boost library(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;

5 个答案:

答案 0 :(得分:8)

std::to_string仅为数字类型提供重载,在这种情况下可能会解析为unsigned版本。 lexical_cast,OTOH,依靠std::ostream::operator<<执行转化,从而将c视为一个角色。

答案 1 :(得分:5)

两者都是正确的。 to_string并不关心c类型为char,它会读取其中的数字并将其转换为字符串。

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

答案 2 :(得分:3)

旧的升级版本不正确。

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

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

相同
std::cout << x

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

另一方面,

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

这不是char到字符串,它是字符串的“unsigned char”。他们都是正确的。 lexical_cast使用stringstream实例进行转换,而std :: to_string因无符号而重载,这意味着unsigned char被提升为unsigned int。