对于无符号字符,boost::lexical_cast 和 std::to_string 的正确结果是什么
What's the correct result of boost::lexical_cast and std::to_string for unsigned char
下面从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_string
与itoa
一样适用于所有整数数据类型,因为它没有unsigned char
的重载。这里的基本原理是,通过调用to_string
,您已经表达了执行转换的意图,即您对值的字符类型质量(这将是默认的)不感兴趣,而是对算术类型质量感兴趣。
这是一个解释问题。如果您将char
解释为一个小整数,则在当前字符集中打印其代码;这是to_string
似乎正在做的。
如果您将其解释为要打印的字符,则发出相应的字符,即8
和boost::lexical_cast
一样。
这不是char到string,而是"unsigned char"到string。他们都是正确的。Lexical_cast使用stringstream实例进行转换,而std::to_string被重载为unsigned,这意味着unsigned char被提升为unsigned int。
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- "No suitable conversion function from 'std::string' to 'const char *' exists"
- 使用词法强制转换在'string to double'中设置双精度变量的精度
- std::string to std::regex
- 如何 SWIG std::string& to C# ref string
- jni String to *char and java.lang.UnsatisfiedLinkError:
- 如何设计一个简单的 std::string-to-boost::p osix_time::p time 解析库
- C++ std::string to Ruby VALUE
- C++ CLI System.String^ to MFC LPCTSTR
- 使用C++中的String To Class Lookup表来实例化类
- 创建新文件时std::string to const char*错误
- 有没有办法"convert string to vector<int>"?
- std::string to LPOLESTR
- C++ stringstream string to function(test, char *test2)
- std::vector<std::string> to char* 数组
- C++: C string to std:string
- 施放一个提升::日志::表达式::attr< std::string > to std::string
- std::string to LPBYTE and RegEnumValueA
- 不能将convert std::string to LPWSTR放入函数中
- vector string to string (or c_string) to lpszString