c++ - 数值转换

标签 c++ visual-studio-2010 visual-c++ c++11

在C++11的头文件中,新增了三个数字与字符串转换的函数。

std::string std::to_string(unsigned long long);
std::string std::to_string(long double);
std::string std::to_string(long long);

第一个问题——为什么只有3个函数? simple int 或 unsigned int 等呢?

第二个问题-为什么to_string后面的代码没有抛出异常?

long double x = std::numeric_limits<long double>::quiet_NaN();
std::string i = std::to_string( x ); 
long double c = std::stold( i ); // i = "1.#QNAN"

第三个问题 - 为什么 c 等于 1.0?

最佳答案

  • 只要它产生所描述的行为,就随心所欲..

    所有内部数字类型都可以隐式转换为 unsigned long long , long doublelong long并且仍然保持所需的精度,因此不再需要重载。

    标准规定应定义以下函数,尽管确认标准的库可以自由地“任何它想做的事”,只要它产生与描述的相同的行为。 p>


  • 为什么要抛出异常?

    std::numeric_limits<long double>::quiet_NaN();是一个有效值,std::to_string (T)在标准中描述为产生与调用相同的行为 sprintf使用适当的格式字符串

§ 21.5/6                   Numeric conversions

  • string to_string(int val);
  • string to_string(unsigned val);
  • string to_string(long val);
  • string to_string(unsigned long val);
  • string to_string(long long val);
  • string to_string(unsigned long long val);
  • string to_string(float val);
  • string to_string(double val);
  • string to_string(long double val);

    ..

Returns:

  • Each function returns a string object holding the character representation of the value of its argument that would be generated by calling sprintf(buf, fmt, val) with a format specifier of "%d", "%u", "%ld", "%lu", "%lld", "%llu", "%f", "%f", or "%Lf", respectively, where buf designates an internal character buffer of sufficient size.

  • 编译器是什么c等于 1.0 ?

    转换应该产生 NaN -value 如果 i 的值是 NaN 的字符串表示形式(不包含任何数字)。

    如果找不到合适的转换,函数被描述为抛出 invalid_argument .

    MSVC 将产生 1.#QNAN尝试转换时 std::numeric_limits<long double>::quiet_NaN();std::string .

    使用 std::stold 时它将查找第一个非空白字符,然后使用找到的尽可能多的数字(在本例中仅为 1 ),因此 c将等于 1.0在函数调用之后。

关于c++ - 数值转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9804853/

相关文章:

c++ - C++ 中的隐式转换涉及哪些数据类型?

visual-studio-2010 - 错误的网关错误 - fiddler 负载测试/visual studio 2010

visual-studio-2010 - F# 中的内部版本号

asp.net - 文档 View 架构与MVC相同吗

c++ - 为类型集合生成标识符

c++ - 重复文字和硬编码

vb.net - 源代码保护

c++ - Visual Studio 2015 : Can't find `char * * __cdecl __p__environ(void)`

c++ - Visual Studio C++ 2005-2013 中的智能感知中缺少函数定义

c++ - 如何细化具有特定像素大小的图像边界?打开简历