数据类型中的位数
我有两个任务分配,一个返回任何机器上int类型的位数。 我以为我会像这样编写我的函数:
int CountIntBitsF() { int x = sizeof(int) / 8; return x; }
那看起来不错吗?
第二部分是用宏返回任何数据类型的任何位数,宏可以从limits.h中获取。 我在我的机器上查找了limits.h,还有http://www.opengroup.org/onlinepubs/007908799/xsh/limits.h.html ,但我认为我真的不明白其中任何一个会返回任何数据类型中的位数。 有什么想法吗? 谢谢。
它是*
,而不是/
。
至于第二部分,请参阅“数值限制”部分。
存储的基本单位是char 。 它并不总是8位宽。 CHAR_BIT在limits.h中定义,并具有char中的位数。
如果你想要用于在内存中存储int的位数,请使用Justin的答案sizeof(int)*CHAR_BIT
。 如果你想知道值中使用的位数,请使用slebetman的答案。
虽然要获取INT中的位,但您应该使用INT_MAX而不是UINT_MAX。 我不记得C99是否确实保证int
和unsigned int
的宽度相同,或者只是它们的存储大小相同。 我怀疑只有后者,因为在6.2.6.2中我们有“如果有符号类型中有M个值位且无符号类型中有N,那么M <= N”,而不是“M = N或M = N-1” 。
实际上,在我使用的任何实现中,积分类型都没有填充位,因此您很可能得到所有的相同答案,+ / – 1用于符号位。
在limits.h
,UINT_MAX是unsigned int类型的对象的最大值。 这意味着它是一个int,所有位都设置为1.因此,计算int中的位数:
#include int intBits () { int x = INT_MAX; int count = 2; /* start from 1 + 1 because we assume * that sign uses a single bit, which * is a fairly reasonable assumption */ /* Keep shifting bits to the right until none is left. * We use divide instead of >> here since I personally * know some compilers which does not shift in zero as * the topmost bit */ while (x = x/2) count++; return count; }
使用g ++ -O2,此函数的计算结果为内联常量:
#include #include #include #include template size_t num_bits() { return sizeof (T) * (CHAR_BIT); } int main() { printf("uint8_t : %d\n", num_bits()); printf("size_t : %d\n", num_bits()); printf("long long : %d\n", num_bits()); printf("void* : %d\n", num_bits()); printf("bool : %d\n", num_bits()); printf("float : %d\n", num_bits()); printf("double : %d\n", num_bits()); printf("long double : %d\n", num_bits()); return 0; }
输出:
uint8_t : 8 size_t : 32 long long : 64 void* : 32 bool : 8 float : 32 double : 64 long double : 96
生成的X86 32位声明:
— SNIP —
movl $32, 8(%esp) <--- const $32 movl $.LC1, 4(%esp) movl $1, (%esp) call __printf_chk movl $64, 8(%esp) <--- const $64 movl $.LC2, 4(%esp) movl $1, (%esp) call __printf_chk
--- SNIP ---
您确定需要多少位,而不是字节数? 在C中,对于给定的类型T
,您可以使用sizeof
运算符找到它所占用的字节数。 字节中的位数是CHAR_BIT
,通常为8,但可以不同。
因此,给定类型T
,类型T
的对象中的位数是:
#include size_t nbits = sizeof(T) * CHAR_BIT
注意,除了unsigned char
类型之外,上面nbits
位的所有可能组合可能不代表T
类型的有效值。
对于第二部分,请注意您可以将sizeof
运算符应用于对象和类型。 换句话说,给定类型T
和这种类型的对象x
:
T x;
您可以通过sizeof(T)
找到T的大小,通过sizeof x
x
的sizeof x
。 如果sizeof
用于对象,则括号是可选的。
鉴于上述信息,您应该能够回答第二个问题。 再问一下你是否还有问题。