例如,以下代码是否在某些系统上没有做出可能不正确的假设?
// Number of bits in an unsigned long long int:
const int ULLONG_BIT = sizeof(unsigned long long int) * CHAR_BIT;
答案 0 :(得分:3)
我同意PSkocik对原始问题的评论。 C11 6.2.6说CHAR_BIT * sizeof (type)
产生类型为type
的对象表示中的位数,但其中一些可能是填充位。
我怀疑对“无假设”代码的最佳选择是简单地检查ULLONG_MAX
(或~0ULL
或(unsigned long long)(-1LL)
的值,这应该都评估为相同的值):
#include <limits.h>
static inline int ullong_bit(void)
{
unsigned long long m = ULLONG_MAX;
int n = 0, i = 0;
while (m) {
n += m & 1;
i ++;
m >>= 1;
}
if (n == i)
return i;
else
return i-1;
}
如果值的二进制模式为全1,则unsigned long long
可以保存的位数与值中的二进制数字相同。
否则,最重要的位不能真正使用,因为二进制中的最大值包含零。