这与我昨天读到的一个问题有关: How to determine how many bytes an integer needs?
无论如何, I 有一个问题的部分是:
我正在寻找最有效的方法来计算存储整数所需的最小字节数而不会丢失精度。
e.g。
int:10 = 1个字节
int:257 = 2个字节
我的问题是,为什么10需要1个字节,为什么257需要2个?根据我的理解,你可以将10表示为1010,即4位,257表示为100000001,即9位。这与字号有关吗?难道你不能只有4位,但你需要整个字节而你不能只有9位,你需要整个2个字节吗?
答案 0 :(得分:3)
没错,字节大小为8位,每个 1 ,你通常不能细分它们。
1 通常(对于学生和穴居人)。
答案 1 :(得分:1)
嘿,是的,每个字节都有一个地址,所以你不能少于一个。
事实上,使用少于4或8有点困难,因为对未对齐标量的访问速度很慢,因此语言处理器在关注缓存块时往往会将可寻址对象与4,8或甚至16的倍数对齐。实际数据总线可能等于寄存器宽度,因此如果对象不是那么对齐(通常是32位或64位),那么实际上两个对象需要被CPU阻塞和组合。这很慢,所以编译器会反对它。
有时候,会增加更多的对齐方式。
通常,单个对象声明将获得4或8字节对齐,但函数,模块(链接器输入文件)或其他大对象可能会获得16或32,因为使用部分缓存块会浪费缓存块的未使用部分,以及缓存性能如今至关重要。
答案 2 :(得分:0)
内存以字节为单位分配,9字节当然需要字节的第二个块来容纳第9位。
答案 3 :(得分:0)
不难想出以减少的字节数或比特数表示小数字的方案。例如,UTF-8是一种将Unicode代码点(最多22位)表示为1,2或3字节序列的方法,确保0到127范围内的代码点占用1个字节。
但是这些方案的缺点往往是,如果你没有对它们进行编码,那么较大的数字往往会占用更多的比特。此外,您需要根据编码和解码数字的额外处理器时间来计算表示数字所需的位数。
我的问题是,为什么10需要1个字节,为什么257需要2?
理论上它没有/他们没有。但实际上,计算机主要用于处理大量的32位字。在字节级别寻址内存,并对可变大小的数字表示进行算术将会慢很多。
此外,内存很便宜,因此对于大多数应用程序来说,仅仅没有足够的回报来证明减少“粒度”之下的“浪费”。