ptrdiff_t太小了?

Meh*_*dad 17 c c++ d

我一直想知道:根据定义,ptrdiff_t应该能够保持任何两个指针的差异吗?当两个指针太远时怎么会失败呢?(我没有指出任何特定语言......我指的是所有具有此类型的语言.)

(例如1,0xFFFFFFFF当你有32位指针时,从带有地址的字节指针中减去带有地址的指针,它会溢出符号位...)

Mat*_* M. 28

不它不是.

$ 5.7 [expr.add](来自n3225 - C++ 0x FCD)
当减去指向同一数组对象的元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应std::ptrdiff_t<cstddef>标题(18.2)中定义的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式PQ指向,分别为i和第j一个数组对象的个元素,表达式(P)-(Q)的值为i ? j提供的值在适合类型的对象std::ptrdiff_t.此外,如果表达式P指向要么一个数组对象或一个过去的阵列对象的最后元件,并且表达的元件Q指向相同的数组对象的最后一个元素时,表达((Q)+1)-(P)具有相同的值((Q)-(P))+1和作为-((P)-((Q)+1)),和如果表达式P指向一个超过数组对象的最后一个元素的值,则值为零,即使该表达式(Q)+1未指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.

请注意undefined段落中出现的次数.另请注意,如果指针指向同一对象,则只能减去指针.

  • @templatetypedef:我很高兴,一次,战斗结束后不要醒来:) @Mehrdad:我会说它是:)另一方面,没有禁止你使用的标准库实现64-即使在32位平台上也是整数位.该标准仅表明他们没有必要付出努力.其余的是实施质量问题. (2认同)
  • @R.:再考虑一下,它让我想起了[二分查找错误](http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly. HTML)... (2认同)
  • @Mehrdad:请注意,“二分搜索错误”在现实情况下不是错误:因为没有数组可以大于“SIZE_MAX/2”,所以两个(无符号)索引的总和无法换行。您链接的文章中的实际错误是使用有符号索引,而需要无符号索引。当然,您被迫使用像 Java 这样缺少无符号类型的损坏语言来执行此操作...... (2认同)

R..*_*R.. 8

不,因为没有"任何两个指针"之间的区别.您只能减去指向同一数组元素的指针(或指向刚好超过数组末尾的位置的指针).

  • 当然是Linux.在早年,有许多传统智慧被忽视了.请问Tannenbaum. (3认同)
  • @Mehrdad:允许内核做出许多不可移植的假设.例如,Linux内核代码假定它将使用GCC编译,并且"long"与指针的宽度相同.在32位和64位系统上,任意两个地址之间的差异将适合64位(因为64位地址中的某些高位未使用). (2认同)