2010-02-18 109 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位字的大塊而設計的。在字節級別尋址內存,並在可變大小的數字表示上進行算術運算會變得很慢。

此外,內存很便宜,所以對於大多數應用程序來說,它是沒有足夠的回報來證明試圖減少字粒度之下的「浪費」。