做的时候
const double d = std::nan ("Hello");
你得到一个包含字符串“Hello”的 NAN。如何从变量 d
中取消这个字符串?是否根本没有符合标准的方式?如果无法取回字符串,此功能似乎意义不大。
最佳答案
C++ 标准规定,在为 fprintf
及其亲戚(例如 printf
)格式化数据时,实现可能会显示以 NaN 编码的数据,并且通过 C++ 功能继承自 fprintf
,例如输出流格式化程序。这是 C++ 标准中关于获取有关 NaN 数据信息的唯一明确规定。 (我在 C 标准中包含了语句,C++ 通过引用将其合并。)关于这一点,该标准表示,实现在格式化 NaN 时可能包含编码数据,但它在实现定义的方式,实现可能会忽略这一点。
当然,您可以通过检查表示数据的字节来检查以 NaN 编码的数据。但是,如何处理传递给 nan
函数的字符是实现定义的。一个实现可以选择不对它们做任何事情,它可以将它们逐字地包含在 NaN 的字节中(如果它们适合),或者它可以编码或解释它们,例如期望字符串中的十六进制数字,它将被编码成NaN 的位。 double
常用的 IEEE-754 基本 64 位二进制浮点格式有 51 位可用于 quiet NaN 的有效负载,足以固定六个八位字符,因此字符串“Hello”可以编码为 NaN。
以下是标准对 nan
函数的解释:
- C++ 从 C 继承了
nan
函数,并将其留给 C 来指定它的作用。 - C 表示
nan("n-char-sequence")
等价于strtod("NAN(n-char-sequence)", (char**)NULL)
。 - C 说n-char-sequence 是数字 和非数字 字符的序列。 数字 字符为 0-9,非数字 字符为 _、A-Z 和 a-z。所以字符串
"Hello"
是一个n-char-sequence。 - C 说,关于带有“NAN”的
strtod
和 *n-char-sequence,n-char-sequence 的含义是实现定义的。
因此,一个实现可能对您在 nan
参数中提供的字节进行编码。
C 标准(和继承的 C++)关于格式化 NaN 的说法是:
- “表示
NaN
的 double 参数被转换为 [-]nan 或 [-]nan(n-char-sequence) 样式之一——哪种样式,以及任何 n-char-sequence 的含义,都是实现定义的。”
关于c++ - 创建包含字符序列的 nan 时,如何取回字符序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51871993/