eru*_*orm 25 c sizeof bit-fields
应用于位域时,Sizeof()不起作用:
# cat p.c
#include<stdio.h>
int main( int argc, char **argv )
{
struct { unsigned int bitfield : 3; } s;
fprintf( stdout, "size=%d\n", sizeof(s.bitfield) );
}
# gcc p.c -o p
p.c: In function ‘main’:
p.c:5: error: ‘sizeof’ applied to a bit-field
Run Code Online (Sandbox Code Playgroud)
......显然,因为它无法返回浮点部分大小或其他东西.然而,它提出了一个有趣的问题.在C中是否有一个等价物来告诉你变量/类型中的位数?理想情况下,除了位域之外,它也适用于常规类型,如char和int.
更新:
如果对于位域没有相当于sizeof()的语言,那么计算它的最有效方法是什么 - 在运行时!想象一下,你有依赖于此的循环,如果改变位域的大小,你不希望它们破坏 - 并且没有公平的作弊,并使位域大小和循环长度成为宏.;-)
sch*_*hot 18
您无法确定C中位字段的大小.但是,您可以使用CHAR_BIT
limits.h中的值找到其他类型的位大小.位大小只是CHAR_BIT
*sizeof(类型).
不要假设C字节是八位字节,它至少是 8位.实际的机器有16位甚至32位字节.
关于你的编辑:
我想说根据定义,位字段int a: n;
的大小为n位.放入struct时的额外填充位属于struct而不属于bit-field.
我的建议:不要使用位字段,而是使用(数组)unsigned char
并使用位掩码.这样很好地定义了很多行为(溢出,没有填充).
使用 sizeof() 不可能找到位域的大小。参考C99:
6.5.3.4 The sizeof operator
, sizeof() 显然不支持位域6.7.2.1 Structure and union specifiers
这里需要澄清的是,bit-field 不是独立成员。否则,您可以尝试分配给位字段成员-1u(设置了所有位的值),然后找到最高有效位的索引。例如(未经测试):
s.bitfield = -1u;
num_bits = ffs(s.bitfield+1)-1;
Run Code Online (Sandbox Code Playgroud)
man ffs
了解更多。
归档时间: |
|
查看次数: |
16094 次 |
最近记录: |