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

关于reinterpret_cast整数与指针互转的两类技术疑问

关于reinterpret_cast的两类转换疑问解答

第一类疑问:整数转指针再转回原整数的等价性

针对以下代码,C++是否保证转换结果等于原变量x?

uintptr_t x;
reinterpret_cast<uintptr_t>(reinterpret_cast<void *>(x)) // == x ?

答案是标准保证结果等于原始的uintptr_t值。
依据在于:uintptr_t是C++标准定义的专门用于存储指针值的无符号整数类型,其大小被保证为足以容纳任意void*指针的值(即sizeof(uintptr_t) >= sizeof(void*))。结合你引用的规则:当指针转换为足够大小的整数再转回原指针类型能得到原值;反过来,将uintptr_t(足够容纳指针的整数)转换为void*后再转回uintptr_t,属于合法的往返转换,标准会保证其保留原始值。

第二类疑问:相等小整数转指针后的等价性

场景:存在int x; int y;且x == y,同时sizeof(int)严格小于sizeof(void*),是否能保证reinterpret_cast<void *>(x) == reinterpret_cast<void *>(y)成立?另外,字面量如reinterpret_cast<void *>(1) == reinterpret_cast<void *>(1)的行为是什么?

针对变量x和y的情况

标准不保证转换后的指针相等。因为当int的长度小于void*时,将int值转换为指针类型时,超出int存储长度的额外字节(即你所说的“垃圾字节”)的值是未定义的。这些额外字节的值可能受变量的内存布局、编译器实现细节等影响,即使x和y的数值相等,转换后的指针整体值仍可能不同。

针对字面量的情况

标准保证比较结果为真。字面量是编译期常量,同一字面量的reinterpret_cast转换操作会由编译器生成一致的指针值,不会引入不确定的额外字节,因此两次转换1得到的指针必然相等。


内容的提问来源于stack exchange,提问作者Jia Cheng Sun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 01:20:25