c ++在floor函数之后以十六进制打印数字

c++ print number in hexadecimal right after floor function

我注意到 c++ 中有一些我不理解的奇怪行为, 我正在尝试以十六进制表示形式打印截断的双精度

此代码输出为17,这是十进制表示

double a = 17.123;
cout << hex << floor(a) << '\n';

虽然此代码输出是 11 也是我的 理想输出

double a = 17.123;
long long aASll = floor(a);
cout << hex << aASll << '\n';

因为 double 可以得到非常大的数字,我担心将截断的数字存储在 long long 变量中时输出错误,有什么建议或改进吗?

Quoting CPPreference's documentation page for std::hex (and friends)

Modifies the default numeric base for integer I/O.

这表明 std::hex 对浮点输入没有任何影响。您将获得的最好的是

cout << hex << static_cast<long long>(floor(a)) << '\n';

或具有相同功能的函数。

如果值始终为正,

uintmax_t 来自 <cstdint> 可能有助于获得最大的可用整数。毕竟,什么是负十六进制数?

由于 double 值很容易超过可用整数的最大分辨率,因此不会覆盖整个范围。如果 floored 值超过整数类型所能容纳的值,您将不得不手动进行转换或使用大整数库。

旁注:std::hexfloat 确实 something very different and does not work correctly in all compilers due to some poor wording in the current Standard 已经敲定,应该在下一次修订中更正。

只需编写您自己的 floor 版本并使其 return 成为一个整数值。例如:

long long floorAsLongLong(double d)
{
  return (long long)floor(d);
}

int main() {
  double  a = 17.123;
  cout << hex << floorAsLongLong(a) << endl;
}