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

GNU EFI开发中UINTN数据类型的定义是什么

UINTN 类型说明

具体定义

UINTN 是UEFI环境下的原生位宽无符号整数类型,位宽始终和目标平台的地址总线宽度保持一致:

  • 编译32位UEFI目标程序时,UINTN 等价于32位无符号整数,占4字节
  • 编译64位UEFI目标程序时,UINTN 等价于64位无符号整数,占8字节
  • 面向128位平台编译时,该类型会自动对应128位无符号整数

它的带符号版本为INTN,位宽规则完全一致。
GNU EFI中该类型通过条件编译定义在基础头文件中,核心逻辑等价于:

#if defined(__x86_64__) || defined(__aarch64__) || defined(__riscv64)
typedef UINT64  UINTN;
typedef INT64   INTN;
#else
typedef UINT32  UINTN;
typedef INT32   INTN;
#endif

IDE无法识别该类型属于正常现象:UINTN不属于C标准定义的原生类型,也不在标准库头文件中,只要没有把GNU EFI的头文件目录加入IDE的代码索引路径,就会提示未定义。

是否为GNU EFI专属

不是。
UINTN/INTN是UEFI官方规范明确定义的通用基础类型,所有UEFI开发套件(包括官方EDK2框架、GNU EFI、其他第三方UEFI SDK)都会实现该类型,只是定义位置和条件编译细节略有区别。
你代码中调用的GetMemoryMap是UEFI标准启动服务接口,规范中明确规定MemoryMapSize、MapKey、DescriptorSize三个出参的类型就是UINTN,和使用的开发SDK无关。

使用规则

  • 所有和平台位宽绑定的场景:包括内存地址、内存长度、UEFI对象键值/句柄、指针互转整数,必须使用UINTN/INTN,禁止硬编码使用固定位宽的uint32_t/uint64_t,避免跨架构编译时出现指针截断、参数栈对齐错误等问题。
  • 打印UINTN类型值时不要直接用标准C的%u/%d占位符:32位环境下可以正常输出,64位环境下会出现打印值错误。如果用UEFI自带的Print函数,使用%lu/%ld占位符即可;如果用标准C库函数,先将值强转为uint64_t再用%llu输出。
  • 结构体中如果需要存和地址访问、长度计算相关的字段,优先用UINTN类型,保证结构体内存布局和UEFI规范要求一致,避免调用系统接口时出现参数不匹配。
  • 你贴出的GetMemoryMap调用写法是标准实现:第一次传入0值的mapSize查询所需缓冲区大小,此时返回EFI_BUFFER_TOO_SMALL是预期行为,拿到实际需要的大小后分配对应内存,再二次调用获取完整内存映射即可,这里三个变量用UINTN声明完全符合规范要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:33:40