C中指向整数转换的指针
Pointer to integer conversion in C
C11 6.3.2.3/6 Any pointer type may be converted to an integer type. Except as previously specified, the
result is implementation-defined. If the result cannot be represented in the integer type,
the behavior is undefined. The result need not be in the range of values of any integer
type.
上面的引述说,如果转换为整数类型后指针表达式的值可以用整数表示,则可以转换它。但有件事困扰着我。我查看了标准,但找不到指向 int 转换的指针是如何发生的。
假设我们有一个指针对象,其纯二进制解释等于 0x100。如果我们将其转换为一个足够精度的无符号整数,我们是否可以说转换后的表达式的值由于标准而等于0x100?
或者让我这样说,是否有关于指针对象在内存中的表示方式的约定?
如您引用的文本所述,结果是实现定义的。根据 C 3.4.1,这是:
unspecified behavior where each implementation documents how the choice is made.
因此,您正在使用的 C 实现(主要是编译器)需要记录如何确定结果。
在具有“平面”虚拟地址空间的实现中,特定范围内的每个位模式代表一个地址,通常将这些位简单地重新解释为二进制数字。所以地址 1 0000 0000 将被转换为数字 256.
但是,具有某种形式的基址和偏移量或段和偏移量寻址的实现可能会形成一个整数,其中某些位为基数而另一位为偏移量,并且还有其他可能性。
C11 6.3.2.3/6 Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.
上面的引述说,如果转换为整数类型后指针表达式的值可以用整数表示,则可以转换它。但有件事困扰着我。我查看了标准,但找不到指向 int 转换的指针是如何发生的。
假设我们有一个指针对象,其纯二进制解释等于 0x100。如果我们将其转换为一个足够精度的无符号整数,我们是否可以说转换后的表达式的值由于标准而等于0x100?
或者让我这样说,是否有关于指针对象在内存中的表示方式的约定?
如您引用的文本所述,结果是实现定义的。根据 C 3.4.1,这是:
unspecified behavior where each implementation documents how the choice is made.
因此,您正在使用的 C 实现(主要是编译器)需要记录如何确定结果。
在具有“平面”虚拟地址空间的实现中,特定范围内的每个位模式代表一个地址,通常将这些位简单地重新解释为二进制数字。所以地址 1 0000 0000 将被转换为数字 256.
但是,具有某种形式的基址和偏移量或段和偏移量寻址的实现可能会形成一个整数,其中某些位为基数而另一位为偏移量,并且还有其他可能性。