【发布时间】:2016-06-13 20:35:04
【问题描述】:
我需要在编译时计算表示范围所需的位数。 对于从 0 到 n 的无符号范围很简单:
constexpr unsigned bits_to_represent(uintmax_t n)
{
return n > 0
? 1 + bits_to_represent(n/2)
: 0;
}
对于有符号范围,我有:
constexpr unsigned bits_in_range(intmax_t min,intmax_t max)
{
return bits_to_represent(max >= 0
? static_cast<uintmax_t>(max) - min
: max - min);
}
但这会导致 MSVC 2015(最近更新)抱怨:
警告 C4308:负整数常量转换为无符号类型
你能解释一下为什么会这样吗?作为一种变通方法,我将 static_cast min 转换为 uintmax_t,但我不喜欢这个解决方案,因为它似乎不如我的首选解决方案可移植,甚至可能是未定义的行为,尽管我怀疑这可能在编译时发生。
【问题讨论】:
-
你能显示调用
bits_in_range的代码吗?如果min > max那么我会期待这个警告,所以也许这是一个简单的错误。 -
抱歉 - 应该一直提到 min
-
错误出现在哪一行?
-
我在 static_cast
(max) - min.
标签: c++ c++11 compile-time