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

C++: Signed or unsigned array indexing?

本文关键字:无符号 数组 索引 符号 C++      更新时间:2023-10-16

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

我看到的问题是由于某个地方的代码看起来像这样:

[signed/unsigned type] result = customArray.GetRowCount() - a;

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

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

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

但是,如开头所述,我不能再为具有最多SIZE_MAX元素的数组编制索引,因为有符号类型的值跨度的一半将用于负值。

我希望我说得有道理,并希望能得到一些澄清和指导。提前感谢大家!

这与个人品味非常接近。

有些人说,除了位操作之外,任何使用无符号整数类型的方法都是错误的,并且对所有量都使用有符号类型。其他人(包括C++标准库的设计者)使用无符号类型来计数。辩论的任何一方都没有证明对方完全是白痴,不会写像样的代码(尽管我认为双方偶尔都有人声称他们写过)。

我觉得,除非你要完全消除无符号类型,否则你还不如复制标准。如果数组由内存支持,那么即使在32位系统上,实现也不太可能创建一个只有地址空间一半大小的数组。在64位系统上,这是完全不可行的。如果你安排你的数组类来防止这种情况发生,那也没什么损失。因此,类型的最大值并不是一个真正的问题。

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