c/c++语言开发共享数据类型中的位数

我有两个任务分配,一个返回任何机器上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是否确实保证intunsigned 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 : %dn", num_bits()); printf("size_t : %dn", num_bits()); printf("long long : %dn", num_bits()); printf("void* : %dn", num_bits()); printf("bool : %dn", num_bits()); printf("float : %dn", num_bits()); printf("double : %dn", num_bits()); printf("long double : %dn", 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 xsizeof x 。 如果sizeof用于对象,则括号是可选的。

    鉴于上述信息,您应该能够回答第二个问题。 再问一下你是否还有问题。

    需要了解更多c/c++开发分享数据类型中的位数,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)

      以上就是c/c++开发分享数据类型中的位数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(计算机技术网)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ctvol.com/c-cdevelopment/980018.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐