我的任务看似简单,我需要计算表示变量整数所需的最小字节数(例如,如果整数是5,那么我想返回1;如果整数是300,我想返回2)。不是指数据类型int,正如注释中所指出的那样,它总是只是sizeof(int),我指的是数学整数。我几乎有一个解决方案。这是我的代码:
int i;
cin >> i;
int length = 0;
while (i != 0) {
i >>= 8;
length++;
}
问题是这对任何负数都没有用(我无法确定原因)或者一些正数,其中最高有效位是0(因为符号位是使得它为1的位)有点大......)我对如何解释这些案件有什么提示或建议吗?
答案 0 :(得分:1)
存储为单个字节,
正数在0x00
到0x7F
范围内
负数在0x80
到0xFF
作为2字节,
正数在0x0000
到0x7FFF
范围内
负数在0x8000
到0xFFFF
作为4字节,
正数在0x00000000
到0x7FFFFFFF
范围内
负数在0x80000000
到0xFFFFFFFF
您可以使用以下功能获得最小尺寸:
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()
。这将返回前导零,然后您可以使用它来确定最小字节数。