C++:有符号或无符号数组索引?

101*_*001 2 c++ arrays indexing 64-bit

我正在从x86将C++应用程序移植到x64.现在,有一个自定义数组类,其函数类似于GetRowCount(); 如果这些函数返回一个size_t(并且整个数组类将处理size_t进行索引),这意味着我可以在这样的数组中得到(2 ^ 64)-1个项目,但如果我将使用带符号的ptrdiff_t代替我会失去很多最大数组大小.我的问题基本上是使用哪些类型:数组的有符号或无符号类型?我一直在阅读其他主题,但他们纯粹专注于索引.

我看到的问题是由于让我们说代码看起来像这样:

[signed/unsigned type] result = customArray.GetRowCount() - a;
Run Code Online (Sandbox Code Playgroud)

在某些情况下,变量"a"可能是有符号的,在其他情况下是无符号的,并且假设它可能大于返回的行数.然后用"结果"变量做什么我不知道,但它可以用于某些进一步的算术运算.

因此,为了避免在使用自定义数组类的代码中混合使用有符号和无符号算术以及隐式转换,我是否应该在该数组类中使用ptrdiff_t,从而让GetRowCount()之类的函数返回ptrdiff_t?或者我应该使用intptr_t,它更合乎逻辑吗?

这里http://www.viva64.com/en/a/0050/示例显示应该使用ptrdiff_t ...

但是,如开头所述,我可以不再索引具有最多SIZE_MAX元素的数组,因为有符号类型的值范围的一半将用于负值.

我希望我有任何意义,并且非常感谢一些澄清和指导.谢谢大家!

Ste*_*sop 5

这非常接近个人品味.

有人说除了位操作之外的任何其他任何使用无符号整数类型都是错误的,并且对所有数量使用有符号类型.其他人(包括C++标准库的设计者)使用无符号类型来计算事物.辩论的任何一方都没有证明另一方是完全不能写出不错的代码的白痴(虽然我认为双方的偶尔个人都声称他们有).

我觉得除非你要完全消除未签名的类型,否则你也可以复制标准.如果阵列由内存支持,则即使在32位系统上,实现也不太可能创建一半大小的地址空间的阵列.在64位系统上,这是完全不可行的.如果你安排你的数组类,以防止它没有太大的损失.所以该类型的最大值并不是真正的问题.

但是,这是新设计的代码.如果该类是中心,那么您不应该更改其界面.如果您需要更多容量,请继续int或切换到ptrdiff_t.绝对不要使用intptr_t.这是用于存储地址,而不是计数或偏移.