计算表示有符号整数所需的最小字节数

时间:2018-01-25 00:15:34

标签: c++ bit-manipulation bitwise-operators

我的任务看似简单,我需要计算表示变量整数所需的最小字节数(例如,如果整数是5,那么我想返回1;如果整数是300,我想返回2)。不是指数据类型int,正如注释中所指出的那样,它总是只是sizeof(int),我指的是数学整数。我几乎有一个解决方案。这是我的代码:

int i;
cin >> i;
int length = 0;
while (i != 0) {
    i >>= 8;
    length++;
}

问题是这对任何负数都没有用(我无法确定原因)或者一些正数,其中最高有效位是0(因为符号位是使得它为1的位)有点大......)我对如何解释这些案件有什么提示或建议吗?

2 个答案:

答案 0 :(得分:1)

存储为单个字节,
正数在0x000x7F范围内 负数在0x800xFF

的范围内

作为2字节,
正数在0x00000x7FFF范围内 负数在0x80000xFFFF

的范围内

作为4字节,
正数在0x000000000x7FFFFFFF范围内 负数在0x800000000xFFFFFFFF

的范围内

您可以使用以下功能获得最小尺寸:

int getmin(int64_t i)
{
    if(i == (int8_t)(i & 0xFF))
        return 1;
    if(i == (int16_t)(i & 0xFFFF))
        return 2;
    if(i == (int32_t)(i & 0xFFFFFFFF))
        return 4;
    return 8;
}

然后,例如,当您看到0x80时,请将其翻译为-128。虽然7F已翻译为127,但0x801应转换为正数。

请注意,这将是非常困难而且毫无意义,应该避免。这不能容纳三位字节的数字存储,为此,你必须自己制作格式。

答案 1 :(得分:0)

可以存储在x字节中的有符号数字的范围 在2的补码中 是-2 ^(8 * x-1)到2 ^(8 * x- 1)-1。例如,1个字节可以存储从-128到127的有符号整数。您的示例将错误地计算出只需要1个字节来表示128(如果我们正在谈论有符号数),因为右移8将等于零,但是最后一个字节需要知道这不是负数。

对于处理底片,将其变为正数并减去一个(因为负数可以存储额外的值)将允许您右移。

int i;
cin >> i;
unsigned bytes = 1;
unsigned max = 128;

if (i < 0) {
    i = ~i; //-1*i - 1
}

while(max <= i) {    
    i >>= 8;
    bytes++;
}
cout << bytes;

如果您使用的是gcc,则另一种选择是使用__builtin_clz()。这将返回前导零,然后您可以使用它来确定最小字节数。