分配字符缓冲区以保存浮点的文本表示形式



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运算符。

要计算整型的最长可表示值是多少,可以使用sizeof如下例所示:

在32位系统中,unsigned long的最大值需要10位数字,加上负号符号-和一个字节的,它至少需要12个字节。所以,我认为下面的表达式是一个很好的估计:

4 * sizeof(unsigned long) // = 16

 

对于float值,这不是真的。在这里,max_exponent10很有用:

std::numeric_limits::max_exponent10 的值最大 正数 n,使得 10n 是 浮点类型 T。

最新更新