计算保存int需要多少字节的算法 对不起,这个愚蠢的问题,但我如何去计算,在数学上或使用C++,多少字节,将需要存储一个整数。

计算保存int需要多少字节的算法 对不起,这个愚蠢的问题,但我如何去计算,在数学上或使用C++,多少字节,将需要存储一个整数。,c++,algorithm,math,C++,Algorithm,Math,你可以找到比你的数字大的2的第一次幂,然后将该次幂除以8,然后将数字四舍五入到最接近的整数。所以对于1000,2的幂是1024或2^10;将10除以8得到1.25,然后四舍五入到2。你需要两个字节来容纳1000 如果你的意思是“一个int有多大”,那么答案就是sizeof(int) /** * assumes i is non-negative. * note that this returns 0 for 0, when perhaps it should be special cased

你可以找到比你的数字大的2的第一次幂,然后将该次幂除以8,然后将数字四舍五入到最接近的整数。所以对于1000,2的幂是1024或2^10;将10除以8得到1.25,然后四舍五入到2。你需要两个字节来容纳1000

如果你的意思是“一个int有多大”,那么答案就是
sizeof(int)

/**
 * assumes i is non-negative.
 * note that this returns 0 for 0, when perhaps it should be special cased?
 */
int numberOfBytesForNumber(int i) {
    int bytes = 0;
    int div = 1;
    while(i / div) {
        bytes++;
        div *= 256;
    }
    if(i % 8 == 0) return bytes;
    return bytes + 1;
}
如果你的意思是“我可以用多小的类型来存储这么大的值”,那么这就有点复杂了。如果您已经有整数形式的值,那么它可能适合4、3、2或1字节。对于无符号值,如果是16777216或以上,则需要4个字节,65536-16777216需要3个字节,256-65535需要2个字节,0-255适合1个字节。这个公式来自这样一个事实:每个字节可以容纳8位,每个字节容纳2位,因此1个字节容纳2^8个值,即256(但从0开始,所以0-255)。因此,2字节包含2^16个值,即65536,依此类推

如果您愿意,您可以将其推广到用于典型int的正常4字节之外。如果需要容纳有符号整数和无符号整数,请记住,1位有效地用于存储它是正还是负,因此大小是2的1次方

通过将整数除以2并丢弃余数,可以从整数迭代计算所需的位数。您可以进行的每一个除法仍然有一个非零值,这意味着您使用的数据多了一位,而您使用的每8位意味着一个字节

计算该值的一种快速方法是使用shift right函数并将结果与零进行比较

int value = 23534; // or whatever
int bits = 0;

while (value)
{
    value >> 1;
    ++bits;
}
std::cout << "Bits used = " << bits << std::endl;
std::cout << "Bytes used = " << (bits / 8) + 1 << std::endl;
int值=23534;//或者别的什么
整数位=0;
while(值)
{
值>>1;
++比特;
}

这基本上与“存储一个数字x需要多少个二进制数字?”相同,您只需要对数

一个n位整数最多可以存储2n-1个数字。因此,给定一个数字x,ceil(log2x)将获得所需的位数

这和手工计算一个数字需要多少个十进制数字是完全一样的。例如,log10 123456=5.09151220,因此,ceil(log10(123456))=6,六位数。

如果你的意思是从一个角度来看,那么简单的答案是:

log(number) / log(2)
(这些是自然的、二进制的还是普通的并不重要,因为除以
log(2)
,它用基数
2
计算对数)

它报告存储数字所需的位数

如果您对在特定语言或环境中高效或常用的数字编码需要多少内存感兴趣,您需要做一些研究。:)

整数的典型C和C++范围是:

 char    1 byte
 short   2 bytes
 int     4 bytes
 long    8 bytes
如果您对任意大小的整数感兴趣,则可以使用,每个库都有自己的内部存储机制,但它们通常会通过4或8字节的数据块存储数字,直到数字的大小。

请尝试以下代码:

// works for num >= 0
int numberOfBytesForNumber(int num) {
   if (num < 0)
      return 0;
   else if (num == 0)
      return 1;
   else if (num > 0) {
      int n = 0;
      while (num != 0) {
        num >>= 8;
        n++;
      }
      return n;
   }
}
//适用于num>=0
int numberOfBytesForNumber(int num){
if(num<0)
返回0;
else if(num==0)
返回1;
如果(num>0),则为else{
int n=0;
while(num!=0){
num>>=8;
n++;
}
返回n;
}
}
假设
sizeof(long int)=4

int nbytes( long int x )
{
  unsigned long int n = (unsigned long int) x;

  if (n <= 0xFFFF)
  {
    if (n <= 0xFF) return 1;
    else return 2;
  }
  else
  {
    if (n <= 0xFFFFFF) return 3;
    else return 4;
  }
}
int n字节(长int x)
{
无符号长整型n=(无符号长整型)x;

如果(n既然还没有人提供最简单的代码,我也可以这样做:

unsigned int get_number_of_bytes_needed(unsigned int N) {
  unsigned int bytes = 0;
  while(N) { 
    N >>= 8;
    ++bytes;
  };
  return bytes;
};
执行此操作的最短代码方式如下所示:

int bytes = (int)Math.Log(num, 256) + 1;

代码足够小,可以内联,这有助于抵消“缓慢”的FP代码。此外,没有分支,这可能会很昂贵。

此代码在我的笔记本电脑上以4.47亿次测试/秒的速度运行,
i
=1到1E9。
i
是有符号整数:

n = (i > 0xffffff || i < 0) ? 4 : (i < 0xffff) ? (i < 0xff) ? 1 : 2 : 3;
n=(i>0xffffff | | i<0)?4:(i<0xffff)?(i<0xff)?1:2:3;

Python示例:没有日志或指数,只有位移位

注意:
0
计为0位,只有正
int
s有效

def位(num):
“”“返回保存int值所需的位数。”“”
如果不是isinstance(num,int):
raise TypeError(“参数的类型必须为int.”)
如果num<0:
raise VALUERROR(“参数不能小于0”)
对于计数中的i(开始=0):
如果num==0:
返回i
num=num>>1

int howmanybytes存储一个整数(){return sizeof(int);}
或者你的意思是什么?如果给你一个数字(比如700),你需要多少字节来存储这个数字(2).你的确切意思是什么?存储从0到N的任何值需要多少字节?从-N到N的任何值?以某种方式表示数字N,以便字节可以唯一地转换回数字N?四个字节
{0,0,0,1}
与两个字节
{0,1}
等不同。你想要
的大小是什么(int)不提供?这正是我的意思。感谢一个简单的解决方案。每个字节都持有<代码> CabyBIT < /Cord>位,而不是8位。为精确度Sharptooth投票,虽然我希望任何在一个没有8位字符的系统上编写C++的人都知道如何计算这类事情。这是不正确的。例如,1024/256是4,准确地说,但正确的答案是2。@Ernest Thank-修复(我想,我现在在地牢里,不能检查它哈哈)。它应该是
CHAR\u BIT
,而不是8。我认为
获取所需字节数(0)
应该返回1,a
do{…,而(N)
将处理该问题。几乎-您需要将其四舍五入到最接近的8的倍数,因为他询问日志(数字)中有多少字节