【问题标题】:Pointer to integer conversion in C指向 C 中的整数转换的指针
【发布时间】:2020-12-04 22:43:18
【问题描述】:

C11 6.3.2.3/6 任何指针类型都可以转换为整数类型。除先前规定外, 结果是实现定义的。如果结果不能用整数类型表示, 行为未定义。结果不必在任何整数的值范围内 输入。

上面的引用说,如果指针表达式在转换为整数类型后的值可以用整数表示,则可以转换它。但是有件事困扰着我。我查看了标准,但找不到指向 int 转换的指针。

假设我们有一个指针对象,它的纯二进制解释等于 0x100。如果我们将它转​​换为一个足够精度的无符号整数,我们可以说转换后的表达式的值由于标准而等于0x100吗?

或者这样说,指针对象在内存中的表示方式有约定吗?

【问题讨论】:

  • the result is implementation-defined
  • 单内存空间,平面内存模型系统具有指向整数转换的指针,这些转换按您描述的方式工作。但是有双内存空间(哈佛架构)和分段内存模型(Intel 8086)系统,从指针到整数的转换,容我们说,更有趣。因此,C 标准故意对转换的工作原理只字不提。事实上,引用中最后一句的意思是,不需要实现来支持指针到整数的转换。

标签: c pointers c11


【解决方案1】:

正如您引用的文本所述,结果是实现定义的。根据 C 3.4.1,这是:

每个实现都记录了如何做出选择的未指定行为。

因此,您使用的 C 实现(主要是编译器)需要记录结果是如何确定的。

在具有“平面”虚拟地址空间的实现中,特定范围内的每个位模式都表示一个地址,通常将位简单地重新解释为二进制数字。所以地址 1 0000 0000 将被转换为数字 256。

但是,具有某种形式的基数和偏移量或段和偏移量寻址的实现可能会形成一个整数,其中基数在某些位,偏移量在另一个位,还有其他可能性。

【讨论】:

    猜你喜欢
    • 2016-03-30
    • 2017-02-12
    • 2013-09-13
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多