首页 文章

数组索引的类型:有符号/无符号整数优势

提问于
浏览 1771
4

在C中,数组索引的默认大小是size_t,在大多数x86-64平台上是64位无符号64位整数 . 我正在为我的高性能计算库构建我自己的std :: vector类(其中一个主要原因是我希望这个类能够获取指针的所有权,std :: vector不会提供) . 对于数组索引的类型,我想要使用:

  • size_t

  • 我自己的index_t将是一个signed int或一个long signed int,具体取决于我的程序

优点或使用有符号整数优于无符号整数,例如

for (index_t i = 0; i < v.size() - 1; ++i)

工作就像是支持(使用无符号整数,当v的大小为0时,这个循环会变得疯狂)

for (index_t i = v.size() - 1; i >= 0; --i)

像它应该的工作,以及许多其他的优点 . 在性能方面,它甚至看起来好一点

a + 1 < b + 1

可以减少为带有符号整数的<b(溢出未定义),而不是无符号整数 . 唯一的优势表现似乎是a / = 2可以简化为无符号整数的移位操作,但不能用带符号的整数 .

我想知道为什么C委员会决定对size_t使用无符号整数,因为它似乎引入了很多痛苦而且只有很少的优点 .

2 回答

  • 4

    对我来说,无符号大小总是最有意义,因为在数组中不能有-32个元素,将大小/长度一直视为有符号数量是非常可怕的 .

    你提到的角落案例可以编码,例如你可以如果 v 在第一种情况下为空(这看起来并不常见,迭代除了最后一个之外的所有元素?),则在输入之前中止循环 .

  • 3

    在标准中使用无符号类型作为索引或大小的动机是基于仅与16位机器相关的约束 . C中任何整数类型的自然类型都是 int ,并注意到,尝试使用无符号类型作为C中的数值值充满了问题 . 如果're worried about the sizes being so big that they don'适合 intptrdiff_t 将是合适的;毕竟,这是指针或迭代器的减法结果的类型 . (事实上 v.size()v.end() - v.begin() 的类型不同,这实际上是标准库中的设计缺陷 . )

相关问题