C ++ 11具有to_string
功能。在引擎盖下,它使用vsnprintf
将值写入char缓冲区。然后,这用于初始化返回的字符串。由于vsnprintf
需要使用缓冲区的大小,因此计算并传入它。
对于确切类型,使用sizeof
计算大小。例如,对于unsigned long
,计算结果为4 * sizeof(unsigned long)
。
但对于浮点类型,它的计算方式不同。在这种情况下,所需缓冲区的大小是使用
在内部计算的__gnu_cxx::__numeric_traits<float>::__max_exponent10 + 20
我认为这只是一种内部库的写作方式
std::numeric_limits<float>::max_exponent10 + 20
我的问题是,为什么大小是以这种方式计算的?为什么他们不能只使用sizeof
运算符。
答案 0 :(得分:0)
要计算积分类型的最长可表示值,可以使用sizeof
,如下例所示:
在32位系统中unsigned long
的最大值需要10
个数字加上负号符号-
和\0
的一个字节,它至少需要{{} 1}}字节。所以,我认为下面的表达是一个很好的估计:
12
对于4 * sizeof(unsigned long) // = 16
值,这不是真的。在这里,float
很有用:
std :: numeric_limits :: max_exponent10的值是最大的 正数n使得10n是可表示的有限值 浮点类型T。