编译时在没有溢出(整数类型)的情况下可以平方的最大值是什么? 在C++中,有一种编译时间的方法来计算一个积分类型 t>代码>的最大值,它可以安全地平方,即数学上的代码> x*x> 设置位的下半部分 对于签名类型,添加1,然后用sqrt(2) #包括 #包括 #包括 模板 constexpr T最大平方(){ 静态断言(std::is_integral_v,“必须是整型”); 如果constexpr(std::is_unsigned_v){ 返回std::numeric_limits::max()>>sizeof(T)*字符位/2; }否则{ constexpr长双sqrt_2=1.41421356237309504880L; 返回值(最大平方()+1)/sqrt_2; } }

编译时在没有溢出(整数类型)的情况下可以平方的最大值是什么? 在C++中,有一种编译时间的方法来计算一个积分类型 t>代码>的最大值,它可以安全地平方,即数学上的代码> x*x> 设置位的下半部分 对于签名类型,添加1,然后用sqrt(2) #包括 #包括 #包括 模板 constexpr T最大平方(){ 静态断言(std::is_integral_v,“必须是整型”); 如果constexpr(std::is_unsigned_v){ 返回std::numeric_limits::max()>>sizeof(T)*字符位/2; }否则{ constexpr长双sqrt_2=1.41421356237309504880L; 返回值(最大平方()+1)/sqrt_2; } },c++,constexpr,sqrt,C++,Constexpr,Sqrt,或者手动定义值,因为尺寸数量非常有限: #include <cstdint> template<typename T> constexpr T largest_squareable(); template<> constexpr int8_t largest_squareable<int8_t>() { return 11; } template<> constexpr uint8_t largest_squareable<u

或者手动定义值,因为尺寸数量非常有限:

#include <cstdint>

template<typename T>
constexpr T largest_squareable();

template<> constexpr int8_t largest_squareable<int8_t>() { return 11; }
template<> constexpr uint8_t largest_squareable<uint8_t>() { return 15; }
template<> constexpr int16_t largest_squareable<int16_t>() { return 181; }
template<> constexpr uint16_t largest_squareable<uint16_t>() { return 255; }
template<> constexpr int32_t largest_squareable<int32_t>() { return 46340L; }
template<> constexpr uint32_t largest_squareable<uint32_t>() { return 65535UL; }
template<> constexpr int64_t largest_squareable<int64_t>() { return 3037000499LL; }
template<> constexpr uint64_t largest_squareable<uint64_t>() { return 4294967295ULL; }
#包括
模板
constexpr T最大平方();
模板constexpr int8_t最大可平方(){return 11;}
模板constexpr uint8_t max_squable(){return 15;}
template constexpr int16_t max_squable(){return 181;}
模板constexpr uint16_t max_squable(){return 255;}
模板constexpr int32_t max_squable(){return 46340L;}
模板constexpr uint32_t max_squable(){return 65535UL;}
模板constexpr int64_t max_squable(){return 3037000499LL;}
模板constexpr uint64_t最大平方({return 4294967295ULL;}
  • 设置位的下半部分
  • 对于签名类型,添加1,然后用
    sqrt(2)
#包括
#包括
#包括
模板
constexpr T最大平方(){
静态断言(std::is_integral_v,“必须是整型”);
如果constexpr(std::is_unsigned_v){
返回std::numeric_limits::max()>>sizeof(T)*字符位/2;
}否则{
constexpr长双sqrt_2=1.41421356237309504880L;
返回值(最大平方()+1)/sqrt_2;
}
}

或者手动定义值,因为尺寸数量非常有限:

#include <cstdint>

template<typename T>
constexpr T largest_squareable();

template<> constexpr int8_t largest_squareable<int8_t>() { return 11; }
template<> constexpr uint8_t largest_squareable<uint8_t>() { return 15; }
template<> constexpr int16_t largest_squareable<int16_t>() { return 181; }
template<> constexpr uint16_t largest_squareable<uint16_t>() { return 255; }
template<> constexpr int32_t largest_squareable<int32_t>() { return 46340L; }
template<> constexpr uint32_t largest_squareable<uint32_t>() { return 65535UL; }
template<> constexpr int64_t largest_squareable<int64_t>() { return 3037000499LL; }
template<> constexpr uint64_t largest_squareable<uint64_t>() { return 4294967295ULL; }
#包括
模板
constexpr T最大平方();
模板constexpr int8_t最大可平方(){return 11;}
模板constexpr uint8_t max_squable(){return 15;}
template constexpr int16_t max_squable(){return 181;}
模板constexpr uint16_t max_squable(){return 255;}
模板constexpr int32_t max_squable(){return 46340L;}
模板constexpr uint32_t max_squable(){return 65535UL;}
模板constexpr int64_t max_squable(){return 3037000499LL;}
模板constexpr uint64_t最大平方({return 4294967295ULL;}

获取constexpr
sqrt
?相关:有望很快实现标准化。编辑:请注意,
sqrt
不是该文件中的
constexpr
的候选项proposal@NathanOliver这并不意味着它不是根据编译器在编译时完成的,对吗?或者我遗漏了什么?不要使用
std::sqrt
,它不是
constepr
。如果您遵循我的链接,它将为您提供一个处理整数的constexpr版本的
sqrt
。您需要在编译时实际计算该值吗?您已经显示了所需的四个值,因此您可以只编写四个类型特征。是否获取constexpr
sqrt
?相关:有望很快实现标准化。编辑:请注意,
sqrt
不是该文件中的
constexpr
的候选项proposal@NathanOliver这并不意味着它不是根据编译器在编译时完成的,对吗?或者我遗漏了什么?不要使用
std::sqrt
,它不是
constepr
。如果您遵循我的链接,它将为您提供一个处理整数的constexpr版本的
sqrt
。您需要在编译时实际计算该值吗?您已经显示了所需的四个值,因此您可以只编写四个类型特征。假设您用模板化的无符号类型t替换了uintmax\u t,这仍然只处理无符号类型,不是吗?对于签名类型,它将调用未定义的行为。请参阅:您的答案会失败很长时间(以及其他签名类型)。这与后续问题无关,您的答案不会回答我的原始问题。我问了一种方法来找到任意有符号或无符号整数类型T的答案。你给了我一个函数,它适用于一种类型uintmax\T。如果我问如何获得给定类型的最大值,我会诚实地说“return 18446744073709551615”,而不是使用,比如说,
std::numeric\u limits::max()
?@nullUser是的,你是对的。我想我读得很草率。很抱歉。现在好多了?这正是我想要的。非常感谢你。我想我实际上更喜欢硬编码答案的“dumb”方法,其他阅读代码的人可能会更容易理解。假设用模板化的无符号类型t替换uintmax\t,这仍然只处理无符号类型,不是吗?对于签名类型,它将调用未定义的行为。请参阅:您的答案会失败很长时间(以及其他签名类型)。这与后续问题无关,您的答案不会回答我的原始问题。我问了一种方法来找到任意有符号或无符号整数类型T的答案。你给了我一个函数,它适用于一种类型uintmax\T。如果我问如何获得给定类型的最大值,我会诚实地说“return 18446744073709551615”,而不是使用,比如说,
std::numeric\u limits::max()
?@nullUser是的,你是对的。我想我读得很草率。很抱歉。现在好多了?这正是我想要的。非常感谢你。我想我实际上更喜欢“愚蠢”的方法,只是硬编码答案,其他人阅读代码可能会更容易理解。