昨天我写了一个函数来获取C中的机器字,但似乎它有问题。
以下是代码:
unsigned machineword()
{
int i = 1;
unsigned temp;
while (temp > 0)
{
i++;
temp = (unsigned)(~0 >> i);
}
return i;
}
答案 0 :(得分:3)
获取unsigned int
宽度的最简单方法是(sizeof(unsigned)*CHAR_BIT
)。
编辑:正如pmg所指出的,你应该知道内存中unsigned
占用的大小与可用于计算的位数之间的理论差异。您的原始代码会尝试计算后者,下面的程序也是如此。上面的技巧计算了内存中占用的空间。
使用>>
计算此数字并不是很方便,因为在C中禁止使用>>
,其数字等于或大于您要移动的类型的位数。如果您知道long long
严格大于int
,则可以通过使用unsigned long long
进行计算来解决此问题:
unsigned machineword()
{
int i = 1;
unsigned temp=1;
while (temp > 0)
{
i++;
temp = (unsigned)(((unsigned long long)~(0U)) >> i);
}
return i;
}
答案 1 :(得分:1)
在保持结构的同时转移过大值时避免UB的最简单方法是:
unsigned machineword()
{
unsigned i = 0;
unsigned temp = ~0U;
while (temp > 0)
{
i++;
temp >>= 1;
}
return i;
}
答案 2 :(得分:1)
要计算位数,您可以使用CHAR_BIT
或UINT_MAX
CHAR_BIT
方法为您提供每个值在内存中占用的位数
UINT_MAX
方法为您提供有效的可用位。
通常两个值都是相同的
#include <limits.h>
#include <stdio.h>
int main(void) {
unsigned tmp = UINT_MAX;
int i = 0;
while (tmp) {
i++;
tmp /= 2;
}
printf("value bits in a unsigned: %d\n", i);
printf("memory bits in a unsigned: %d\n", CHAR_BIT * (int)sizeof (unsigned));
return 0;
}