Ste*_*ker 11
在大多数现代普通机器中,可能.
但是,我敢打赌,有一些模糊的编译器或配置(比如,使用32位整数运算的16位寻址机器),情况并非如此.
一个uintptr_t的保证同时容纳,虽然如此,如果你想使用该类型.
这是一个示例,当将整数转换为指针时,将指针转换为整数可能不会导致相同的指针。
给定一个具有 24 位地址并使用两个 16 位数量来描述位置的架构。设一个数量为 SEGMENT,另一个为 OFFSET。位置由符号 SEGMENT:OFFSET 指定。
实际的 24 位(物理)地址计算如下:
address = segment * 16 + offset.
Run Code Online (Sandbox Code Playgroud)
使用这种表示法,可以有多个 SEGMENT:OFFSET 对来描述相同的物理地址。
转换为整数时,使用 32 位(无符号)数量(以简化处理器中的内部计算)。问题是如何将物理地址转换为创建物理地址时使用的相同 SEGMENT::OFFSET。
将整数转换为指针的通用方程是:
offset = address & 0xFFFF; // Mask off high order bits, keep lower 16.
segment = address >> 16; // Shift address right 16 bits, zero fill.
Run Code Online (Sandbox Code Playgroud)
虽然这个新段的物理地址和偏移量等于原来的 SEGMENT:OFFSET 的物理地址,但不能保证段和偏移量相同。
为了优化代码,有些处理器指令在段中使用相对寻址。当 SEGMENT 值由于从物理地址转换而发生变化时,这些指令可能会变得混乱。
在这种情况下,可以从指针转换为整数。但是,强烈反对从整数转换为指针。运行时可能会出现难以调试的错误。
额外问题:你能说出实际的架构吗?