gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:37:07 26 4
gpt4 key购买 nike

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

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

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

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

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

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

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

我希望我说得有道理,非常感谢您提供一些说明和指导。提前谢谢大家!

最佳答案

这与个人品味非常接近。

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

我觉得,除非您打算完全消除无符号类型,否则您不妨复制标准。如果数组由内存支持,那么即使在 32 位系统上,实现也不太可能创建地址空间大小一半的数组。在 64 位系统上,这是完全不可行的。如果你安排你的数组类来防止它损失不大。所以类型的最大值并不是真正的问题。

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

关于C++:有符号或无符号数组索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com