【发布时间】:2016-03-30 06:08:59
【问题描述】:
我已经阅读了这个网络上关于这个主题的几个问题,但我仍然有疑问。
在标准 C 中我们可以阅读:
6.3.2.3.p.5:整数可以转换为任何指针类型。 [...]
6.3.2.3.p.6:任何指针类型都可以转换为整数类型。 [...]。
省略的文本(将放在括号 [...] 中)只是讨论了转换失败时可能发生的问题。
但是我的问题更笼统:
- 我观察到 整数数学数字 作为一组值是无限的。
- C 中的任何整数类型都只能表示整数数学值的有限子集。
- 在第 6.3.2.3.p5/p6 段中,标准 C11 似乎假定“每个指针值都可以映射到 整数数学值”。
- 此外,C11 标准的修订方式似乎表明只有当这个数学(或抽象)值不能以开发人员选择的预期整数类型表示时,无论出于何种原因,是操作失败的时候。
我的问题是:我在第 (3.) 点的解释是否正确?
另一方面,当我们定义一个大小为 N 的 T 类型数组时,
因为我们可以对数组的位置进行整数运算,
结果很明显,至少在“本地”级别,在一个数组中,
我们有该数组的相应内存块的行为
算术上,与从 0 到 N-1 的数字集相同的方式,比如说。
通过定义数组或分配的对象,我们可以确定,在 C 中,
内存地址可以“本地”被认为在算术上等同于整数子集。
但是,这种“本地”行为不足以得出结论
标准 C 假设一个内存模型,其内存地址可以被视为“只有一个且相同的整数集”的一部分。
然而,6.3.2.3.p5/p6 似乎“暗示”了这个更强的断言,尽管我并不完全确定。
另一个问题可能会带来更多启示:
- 在标准C中打开了两个不同的有效指针
p、q(即:p != q)的可能性,当转换为整数类型时,得到的整数值变为相等强>。
【问题讨论】:
-
你眼中的“整数非数学值”是什么?
-
@cad:我试图将抽象的值集(它是无限的并具有某些形式属性)与能够在 C 中以给定整数类型表示的值的特定子集区分开来。在给定类型中旨在成为“整数”的值的行为与数学“整数”不同。例如,无符号整数中的 UINT_MAX+1 == 0。行为不同,因此它们不是“数学”,而是紧密模拟。
-
我认为你想太多了。我只记得指针可以转换为标准整数类型,其中只有
uintptr_t和intptr_t保证能够保持其值。 -
那么任何类型的“数学”如何?据我从您的解释中可以看出,纯粹的“数学”类型能够保存所有可能的整数值,这是不可能的,因为可用的内存量是有限的。
-
@cad:我不认为纯粹的“数学”值在 C 中具有类型。就像人们可以说“值(纯数学或抽象)1 亿不可表示一样在 64 位 unsigned long long 类型中”。这种语言模式只谈论“数学”或“抽象”数字,没有类型,但随后描述了给定的类型。在讨论指针到整数转换的问题时,我试图阐明这种讨论模式是否与第 6.3.2.5p.5/p.6 段中的相同。
标签: c pointers language-lawyer c99 c11