使用按位运算符的函数Sizeof

时间:2017-02-19 03:41:10

标签: c bit-manipulation sizeof

如何仅使用按位运算符实现sizeof函数?这个问题在采访中问我。我试图解决它,但它只适用于unsigned int。在这里我也附上了代码。

unsigned int a = 1;
int b = 0;
while(a != 0){
    a = a << 1;
    b++;
}
b = b/8;
printf("%d",b);

注意:不允许使用指针。

1 个答案:

答案 0 :(得分:2)

正如我之前所写,sizeof不是一个功能;它是一个运算符,是一种特殊类型的运算符,其参数未被评估其值,因此sizeof *(char *)NULL完全有效并且不会导致段错误的原因。这应该在采访中指出。

此外,这个问题是浪费时间,也是应该向采访者指出的事实。那时我会走出门,走向更明智的采访。如果他们经常追逐这种毫无意义的练习,你可能不想为这家公司工作。

话虽如此,受此欢迎的人可能会得出offsetof宏可能有用的结论。形成包含给定类型的struct虚拟元素,然后使用offsetof确定虚拟元素的偏移量。

#include <stddef.h>
#include <stdio.h>
#define my_sizeof(x) ((size_t) offsetof(struct { x fu; char ba; }, ba))
int main(void) {
    printf("my_sizeof (char):   %zu\n", my_sizeof(char));
    printf("my_sizeof (void *): %zu\n", my_sizeof(void *));
}

请注意,在幕后,offsetof宏可能会使用指针。我看到的唯一选择是使用&地址运算符(例如this question),不要与按位&运算符混淆(我认为您和/或您的采访者是做,也有待指出);这违反了您的要求,因为肯定使用指针。

然后,如果你根本不能使用指针,那么你排除了数组和函数调用;根据这一要求,整个语言几乎毫无用处。