数据类型选择

  • 避免使用固定大小的类型(如 int),改用跨平台的精确宽度类型(如 int32_t、uint64_t 等 C/C++ 中的 stdint.h 定义类型)
  • 注意指针大小差异:32 位系统指针为 4 字节,64 位为 8 字节,避免将指针强制转换为 int 等固定大小类型

内存处理

  • 计算内存大小时使用 sizeof()而非硬编码数值
  • 注意数组索引和偏移量计算,避免因指针大小变化导致越界
  • 序列化/反序列化数据时明确指定类型大小,避免跨平台传输错误

常量与宏定义

  • 避免使用依赖于系统位数的常量(如 0xFFFFFFFF 作为掩码在 32 位是全 1,64 位则不是)
  • 使用条件编译区分不同架构(如 C/C++ 中的 #ifdef _WIN64#ifdef __x86_64__

函数与库调用

  • 注意库函数的参数和返回值类型是否与系统位数相关
  • 确保链接正确版本的库文件(32 位/64 位库不能混用)
  • 对于 Windows API,注意使用正确的数据类型(如 HANDLE 在 64 位系统是 64 位)

文件格式与网络协议

  • 处理文件格式时明确数据的字节长度和字节序
  • 网络传输中确保数据按照协议规定的大小传输,不受本地系统位数影响

编译与构建

  • 使用跨平台构建工具(如 CMake)并正确配置位数参数
  • 为不同架构提供独立的编译目标和输出目录
  • 编写自动化测试验证两种架构下的正确性

示例

#include <stdint.h>

#ifdef _WIN64
    #define PLATFORM "64-bit Windows"
#elif _WIN32
    #define PLATFORM "32-bit Windows"
#elif __x86_64__
    #define PLATFORM "64-bit Unix/Linux"
#elif __i386__
    #define PLATFORM "32-bit Unix/Linux"
#endif

// 使用明确大小的类型
uint32_t calculate_checksum(const void* data, size_t length) {
    // 确保算法在不同位数系统上表现一致
    uint32_t checksum = 0;
    const uint8_t* bytes = (const uint8_t*)data;
    
    for (size_t i = 0; i < length; i++) {
        checksum = (checksum << 8) ^ bytes[i];
    }
    return checksum;
}