我得到了十六进制数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.
我的错误是什么?
答案 0 :(得分:7)
我的错误是什么?
使用错误的工具。
如果您在自己喜欢的文档中查找sizeof
,您会看到它会告诉您对象或类型占用的字节数。这与计算整数值中有效位的数量无关,我不知道你从哪里得到它的概念。
如果要计算整数中的有效位,则需要以下任一项:
__builtin_clz
in GCC(从类型中的总位数中减去 - 现在,您可以使用sizeof
!)答案 1 :(得分:0)
我的代码必须以位为单位确定此数字的大小
意味着什么?
是吗:
您(未指定)架构中原生的最小类型的大小,它可以代表您的号码?
在这种情况下,您的代码
sizeof(num[2])*4
是错误的,因为它(由于某种原因)假设4位字符。如果您想知道char中的位数,则称为CHAR_BIT
。 sizeof
表达式正确地为您提供字符大小,因此代码应为
sizeof(num[2])*CHAR_BIT
但请注意sizeof(num[2])==sizeof(num[0])==sizeof(int)
,因为每个int的大小相同:它不依赖于它所拥有的值。
或者您是否想要可以代表您的号码的最小位数,忽略这些位的存储位置?
在这种情况下, log 2 (n)为您提供数字所代表的2的幂。以此为基础(将浮点值截断为整数)为您提供最高位的编号。加一个得到位数(它们从零开始,因为你需要一位表示1 = 2 0 )。
如果您想在不使用对数的情况下执行此操作,请先在基数2中写出您的数字(从较小的数字开始进行测试,以节省时间)。提示:检查将它除以2时会发生什么。