2010-06-07 58 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