You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux 64位系统下适配32位代码中long类型的问题求助

解决32位MUD程序迁移64位系统的数据存储兼容性问题

核心思路:用typedef固定数据类型大小

通过typedef定义与原32位系统中long/unsigned long等价的固定宽度类型,替代代码中所有相关变量类型,既避免全局替换的错误,又保证存储数据的字节长度和原程序完全一致。

步骤1:定义固定宽度的自定义类型

在程序的全局公共头文件中添加以下代码:

#include <stdint.h>
// 对应原32位系统中的long(32位有符号整数)
typedef int32_t mud_long;
// 对应原32位系统中的unsigned long(32位无符号整数)
typedef uint32_t mud_ulong;

步骤2:全局替换代码中的类型

将代码中所有:

  • long 替换为 mud_long
  • unsigned long 替换为 mud_ulong

注意:替换时要排除字符串常量、注释中的内容,可使用编辑器的"单词匹配替换"功能避免误改。

步骤3:修正存储前的检查逻辑

把原代码中的类型检查逻辑:

if ((sizeof(char) != 1) || (int_size != long_size))
{
  logit(LOG_DEBUG,
        "sizeof(char) must be 1 and int_size must == long_size for player saves!\n");
  return 0;
}

修改为直接验证自定义类型的宽度(确保是32位):

if ((sizeof(char) != 1) || (sizeof(mud_long) != 4))
{
  logit(LOG_DEBUG,
        "sizeof(char) must be 1 and mud_long must be 32-bit for player saves!\n");
  return 0;
}

这样就不再依赖int和long的大小相等,完全适配64位系统的类型规则。

步骤4:修正格式符匹配问题

如果代码中使用printf/scanf等函数处理这些类型,需要替换对应的格式符(避免类型不匹配导致的输出/读取错误):

  1. 引入头文件 #include <inttypes.h>
  2. 替换格式符:
    • 原%ld 替换为 %" PRId32 "(对应mud_long)
    • 原%lu 替换为 %" PRIu32 "(对应mud_ulong)

示例:

// 原代码
printf("Player experience: %ld\n", player->exp);
// 修改后
printf("Player experience: %" PRId32 "\n", player->exp);

方案优势

  • 自定义类型强制固定为32位,和原32位程序中long的字节长度完全一致,保证存储到文件的字节流格式不变,无需重写存/取逻辑。
  • 避免了直接替换long为int32_t时,unsigned long变成非法unsigned int32_t的问题。
  • 不需要-m32编译选项,解决了依赖64位库的链接冲突问题。

内容的提问来源于stack exchange,提问作者OBR_EXO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:27:24