我有一个掩码程序(为给定大小的底部创建全1位掩码):
如果我调用
template<class T>
T bottom_half() {
T halfway = ((sizeof(T) * 8) / 2);
T mask = (1 << halfway) - 1;
return mask;
}
如果我调用
bottom_half<int>()
或者 long
或者 char
,它可以正常工作。但是当我使用 long long
运行时,halfway
被正确设置为 32
,但是 mask
是 0
。这是为什么?
std::numeric_limits<T>::digits / 2
。上面使用的表达式假设char
有8位,这是必需的(尽管我不知道任何平台不是8位)。 - Dietmar Kühlchar
不需要恰好有8位。它至少有8位。我听说过唯一一个拥有超过8位char
的平台是一些Cray,据说它们有64位的char
。 - Dietmar Kühlstatic constexpr int digits
; 可以表示而不改变的radix
数字的数量。” 3.9.1 [basic.fundamental]第7段规定:“...整数类型的表示应使用纯二进制计数系统定义值...” 我认为这相当于内置整数类型的基数为2。十进制数字的数量由std::numeric_limits<T>::digits10
给出。 - Dietmar Kühl