2010-06-07 60 views
0

這是我用高級編程語言來獲得自我的方式。操作變量的地址以存儲較小的類型?


我有一個32位的值寫入到緩衝器的功能,並且在堆棧上一個uint64_t。下面的代碼是一種理智的方式來存儲它嗎?

uint64_t size = 0; 
// ... 
getBytes((uint32_t*)&size+0x1); 

我假定這將是規範的,安全的方式:

uint64_t size = 0; 
// ... 
uint32_t smallSize; 
getBytes(&smallSize); 
size = smallSize; 
+0

是否有你在堆棧中使用'uint64_t'而不是32位類型的原因? – 2010-06-07 21:08:34

+0

@Justin Ethier,是的。有兩種不同環境的代碼路徑。一個生成一個32位的值,另一個生成一個64位的值。使用64位變量可以使路徑回到一起。 – s4y 2010-06-07 21:22:45

+0

第二個例子確實是這樣做的正確方法。 – caf 2010-06-08 01:26:53

回答

3

號是否能夠正常工作只在大端機器。假設一個特定的字節順序 - 甚至沒有先檢查 - 不是理智的。

即使您確定您的程序現在只在大端機器上運行,您也永遠不會知道它將來是否需要在小端機器上運行。 (我在一家公司製造的計算機上編寫這個程序,這家公司使用高端處理器數十年,然後幾年前轉向小端處理器,現在在某些設備中使用雙端處理器也很成功; ))

+0

呵呵,實際上我只是爲公司的機器編寫這段代碼 - 幸運的是,它足夠在一個代碼路徑上,而這個代碼路徑只用於大型數據庫。不過,我會接受建議。 – s4y 2010-06-07 21:23:30

0

爲什麼不讓getBytes()返回uint64_t?並使用參數(例如int *)返回錯誤代碼(如果有的話)。根據我個人的經驗,如果你真的想要統一兩個代碼路徑,那麼在這兩個代碼路徑中使用uint64_t。

另請注意,「(uint32_t *)&大小」打破了C99嚴格的別名規則(例如在GCC中必須禁用優化)。

+0

謝謝,但'getBytes'是一個不受我控制的庫函數的佔位符。 – s4y 2010-06-08 16:34:55