如何判断long变量中存储的地址值是32位还是64位?
long类型存储地址的位宽检测方案
核心判断逻辑
32位地址的有效数值最大为2^32 - 1,即十六进制的0xFFFFFFFF,只要long变量中存储的地址原始值超过这个阈值,就属于64位地址。
各语言实现示例
C/C++ 实现
- 注意要将long强转为无符号类型,避免符号位干扰判断
#include <stdio.h> int get_address_bit_width(long addr) { unsigned long unsigned_addr = (unsigned long)addr; // 超过32位地址最大值则判定为64位 return unsigned_addr > 0xFFFFFFFFUL ? 64 : 32; } int main() { long a = 0x06000000; long b = 0x13FFF0000; printf("a是%d位地址\n", get_address_bit_width(a)); // 输出32 printf("b是%d位地址\n", get_address_bit_width(b)); // 输出64 return 0; }
Java 实现
- Java的long默认为64位有符号类型,直接比较即可
public class AddressWidthCheck { public static int getAddressBitWidth(long addr) { return addr > 0xFFFFFFFFL ? 64 : 32; } public static void main(String[] args) { long a = 0x06000000L; long b = 0x13FFF0000L; System.out.println("a是" + getAddressBitWidth(a) + "位地址"); System.out.println("b是" + getAddressBitWidth(b) + "位地址"); } }
注意事项
如果long变量存储的地址存在高位符号扩展的情况,需要先清理掉高位无效的扩展位后再执行判断,否则会出现误判。
内容的提问来源于stack exchange,提问作者hex X
相关产品推荐
相关产品推荐

