用c ++确定数字大小

时间:2018-02-26 15:41:41

标签: c++ arrays integer hex size

我得到了十六进制数0x04030201 ,存储在一个充满零的数组中间。我的代码必须在中确定此数字的大小。

我需要以两种不同的方式实现这一点。我的第一种方法是使用这样的sizeof()函数:

#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
    int num[] = {0,0,0x04030201,0,0};

    cout<<"The size of the integer is "<<sizeof(num[2])*4<<" bits."<<endl;

    return 0;
}

我的预期输出是28位(7位有效字符的4位)。但我的输出结果是:

The size of the integer is 16 bits.

我的错误是什么?

2 个答案:

答案 0 :(得分:7)

  

我的错误是什么?

使用错误的工具。

如果您在自己喜欢的文档中查找sizeof,您会看到它会告诉您对象或类型占用的字节数。这与计算整数中有效位的数量无关,我不知道你从哪里得到它的概念。

如果要计算整数中的有效位,则需要以下任一项:

  1. 使用按位算术或
  2. 计算此值的数值算法
  3. 为您执行此操作的内在编译器,例如: __builtin_clz in GCC(从类型中的总位数中减去 - 现在,您可以使用sizeof!)

答案 1 :(得分:0)

  

我的代码必须以位为单位确定此数字的大小

意味着什么?

是吗:

  1. 您(未指定)架构中原生的最小类型的大小,它可以代表您的号码?

    在这种情况下,您的代码

    sizeof(num[2])*4
    

    是错误的,因为它(由于某种原因)假设4位字符。如果您想知道char中的位数,则称为CHAR_BITsizeof表达式正确地为您提供字符大小,因此代码应为

    sizeof(num[2])*CHAR_BIT
    

    但请注意sizeof(num[2])==sizeof(num[0])==sizeof(int),因为每个int的大小相同:它不依赖于它所拥有的值。

  2. 或者您是否想要可以代表您的号码的最小位数,忽略这些位的存储位置?

    在这种情况下, log 2 (n)为您提供数字所代表的2的幂。以此为基础(将浮点值截断为整数)为您提供最高位的编号。加一个得到位数(它们从零开始,因为你需要一位表示1 = 2 0 )。

    如果您想在不使用对数的情况下执行此操作,请先在基数2中写出您的数字(从较小的数字开始进行测试,以节省时间)。提示:检查将它除以2时会发生什么。