2010-02-18 60 views
1

这有一个问题,我昨天读做: How to determine how many bytes an integer needs?整数的大小?

不管怎么说,一部分有问题的就是这个:

我在寻找最有效的方式来计算存储整数所需的最小字节数,而不会失去精度。

例如

INT:10 = 1字节

INT:257 = 2字节

我的问题是,为什么需要10 1个字节,和为什么257需要2?据我所知,你可以将10表示为1010,即4位,257表示100000001,即9位。它是否与字的大小有关?难道你不能只有4位,但你需要整个字节,你不能只有9位,你需要整个2字节?

回答

3

这是正确的,字节进来8位每个的大小和你通常无法细分他们。

通常(对于书呆子和穴居人)。

1

嘿,是的,每个字节都有一个地址,所以你不能用不到一个。

实际上,使用少于4或8是有点困难,因为访问未对齐标量的速度很慢,所以当关心高速缓存块时,语言处理器倾向于将可寻址对象与4,8或甚至16的倍数对齐。实际的数据总线可能与寄存器宽度相等,所以如果一个对象不是如此对齐(通常是32或64位),那么真正需要两个对象被CPU阻塞和合并。这很慢,所以编译器会防止它。

有时,甚至更对准加入。

典型,个体对象的声明将得到4-或8-字节对齐,而是一个功能,模块(接头输入文件),或其它大的物体可以得到16或32,因为使用部分的高速缓存块的倾向浪费高速缓存块中未使用的部分,并且近来缓存性能至关重要。

0

存储器以字节分配当然9字节将需要的字节的第二块,以容纳第9位。

0

不难拿出表示以字节或比特的数量减少的小数量的方案。例如,UTF-8是表示Unicode代码点(高达22位)作为在确保范围内的代码点的方式1,2或3个字节序列0至127占用1个字节的一种方式。

但这些方案往往有较大的数字往往需要更多的比特来表示比如果你没有编码它们的缺点。此外,您还需要根据编码和解码数字的额外处理器时间来表示数字所需的位数。

我的问题是,为什么10需要1个字节,为什么257需要2?

理论上它不/它们不。但实际上,计算机主要是为处理32位字的大块而设计的。在字节级别寻址内存,并在可变大小的数字表示上进行算术运算会变得很慢。

此外,内存很便宜,所以对于大多数应用程序来说,它是没有足够的回报来证明试图减少字粒度之下的“浪费”。