C++:有符号或无符号数组索引
C++: Signed or unsigned array indexing?
我正在将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
。这是用于存储地址,而不是计数或偏移量。
- 使用无符号字符数组有效存储内存
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 寻找一种更好的方法来表示无符号字符数组
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 字符数组到无符号字符 *
- 将字符串转换为无符号字符数组/字节数组
- 如何将字符串转换为无符号字符数组
- 在Arduino中将字符串转换为(逗号分隔的十六进制)字符串到无符号字符数组
- 将'\x00\x00\x00'格式的字符串转换为无符号字符数组
- C++ - 将任何文件的字节读取到无符号字符数组中
- 是否可以将无符号字符数组reinterpret_cast到仅包含C++中无符号字符成员的结构指针
- 如何在 c++ 中读取/写入无符号数组到 ifstream/ostream?
- C++:有符号或无符号数组索引
- 我可以将符号数组传递给宏吗?
- 线程安全的无锁数组
- (最好是boost)无锁数组/矢量/映射等