这就是我用高级编程语言放纵自己所得到的。
我有一个将 32 位值写入缓冲区和uint64_t
堆栈上的函数。下面的代码是一种明智的存储方式吗?
uint64_t size = 0;
// ...
getBytes((uint32_t*)&size+0x1);
我假设这将是规范、安全的风格:
uint64_t size = 0;
// ...
uint32_t smallSize;
getBytes(&smallSize);
size = smallSize;
这就是我用高级编程语言放纵自己所得到的。
我有一个将 32 位值写入缓冲区和uint64_t
堆栈上的函数。下面的代码是一种明智的存储方式吗?
uint64_t size = 0;
// ...
getBytes((uint32_t*)&size+0x1);
我假设这将是规范、安全的风格:
uint64_t size = 0;
// ...
uint32_t smallSize;
getBytes(&smallSize);
size = smallSize;
不,它只能在大端机器上正常工作。假设一个特定的字节顺序——甚至没有先检查它——是不理智的。
即使您确定您的程序现在只能在大端机器上运行,您也永远不会知道它将来是否必须在小端机器上运行。(我是在一家公司制造的计算机上写这篇文章的,该公司几十年来一直使用大端处理器,然后几年前改用小端处理器,现在在某些设备中使用双端处理器也相当成功;- ))
为什么不让 getBytes() 返回 uint64_t?并使用参数(例如 int *)返回错误代码(如果有)。
从我个人的经验来看,如果你真的想统一两个代码路径,那么在两者中都使用 uint64_t 。
另请注意,“(uint32_t*)&size”违反了 C99 严格的别名规则(例如,在 GCC 中必须禁用优化)。