首页 > 解决方案 > 保证 f(ULLONG_MAX) * f(ULLONG_MAX) 不大于 ULLONG_MAX 的公式

问题描述

我正在创建一个容器类,并且我想指定它的最大大小(如果乘以自身)不应超过unsigned long long(特别是std::numeric_limits<unsigned long long>::max())的最大值。

假设ULLONG_MAX2 64 -1,这个计算有多安全,如果有必要我该如何改进它?

typedef unsigned long long size_type;
size_type max_size = size_type(std::sqrt(ULLONG_MAX)) - 1;

标签: c++

解决方案


2 32的平方是 2 64,太大了。

2 32 - 1 的平方等于 2 64 -2 33 +1。

所以只需使用 2 32 -1。

通常,如果是无符号整数类型,则可(static_cast<T>(1) << static_cast<T>(sizeof(T)*4)) - 1以为您提供 type 的最大可平方无符号值。TT


推荐阅读