8

我确实意识到这个标题一开始可能听起来很傻,但请耐心等待我一会儿。:)

自从我开始使用size_tandptrdiff_t之后,我就再也没有使用过 forint,在我的记忆中。

我记得最近使用的唯一整数数据类型属于以下类别之一:

  1. (无符号)与某个内存数据结构(例如vector)的索引相关联的整数。
    几乎总是,最合适的类型是size_t(或者...::size_type,如果您要加倍努力)。
    即使整数实际上并不代表索引,但通常它仍然与某个索引相关联,因此仍然size_t是合适的。

  2. 的签名版本size_t。在许多情况下,最合适的类型似乎是ptrdiff_t,因为通常当您需要它时,您正在使用迭代器——因此size_tptrdiff_t都适合它们。

  3. long. 我偶尔需要这个_InterlockedIncrement(引用计数)。

  4. ( unsigned) long long,用于保存文件大小。

  5. unsigned int或者unsigned long,用于“计数”目的(例如,每 100 万次迭代,更新 UI)。

  6. unsigned char用于对内存的原始字节级访问。
    (旁注:我从来没有发现任何一个用途signed char。)

  7. intptr_t以及uintptr_t偶尔存储操作系统句柄、指针等。

的一个特殊方面int是你不应该溢出它(因为它是未定义的行为),所以你甚至不能可靠地使用它来进行计数——特别是如果你的编译器将它定义为 16 位。

那么,您应该何时使用int(除了您的依赖项已经需要它时)?
现在它有什么真正的用途,至少在新编写的可移植代码中?

4

4 回答 4

9

全可读性的最重要原因怎么样。(和简单的数学)

long weeklyHours = daysWorked * hoursPerDay;

“好吧……不过话说回来,一个人每周实际上可以工作多少,我们需要一个long

size_t weeklyHours = daysWorked * hoursPerDay;

“等等……我们是weeklyHours用来迭代一个向量吗?”

unsigned int weeklyHours = daysWorked * hoursPerDay;

“够清楚了。” - 如果其中一个可能是负数,则可能是错误的来源(逻辑的一部分 - 这可能是一种解释休假或休假的方法,不重要)

int weeklyHours = daysWorked * hoursPerDay;

“好吧,很简单。我明白这是在做什么。”

于 2012-12-18T05:16:48.247 回答
6

Luchian 有一些优秀的可读性点,我将添加一些技术点:

  • 编译器希望选择一个可以int有效处理的大小,而long可能不是(每个操作会冒更多的 CPU 周期、更多的机器代码字节、需要更多的寄存器等)
  • 使用有符号类型可以消除一些错误,例如:
    • abs(a - b)b在数学上看起来是正确的,但在>a并且它们没有符号时没有给出直观的结果
    • int second_delta = (x.seconds - y.seconds) + (x.minutes - y.minutes) * 60;
    • if (pending - completed > 1) kick_off_threads()
  • 当需要一个完整的哨兵值时-1,经常使用:对于无符号类型,这将被转换为可能的最大值,但这可能会导致误解和编码错误(例如if (x >= 0)测试非哨兵)

此外,有符号整数和无符号整数之间的隐式转换有很大的范围 - 重要的是要理解无符号类型很少有助于强制执行“非负”不变量:如果这是吸引力的一部分,你最好写一个类强制执行不变量的构造函数和运算符。

在可读性方面,int表示对一个明显跨越问题域的数字的一般需求 - 它可能过多,但它在机器代码操作和 CPU 周期方面很便宜,因此是通用整体存储的首选类型。如果您开始使用 sayunsigned char来存储某人的年龄 - 它不仅不能很好地与operator<<(std::ostream&...). (尤其是对基于堆栈的变量感到困惑),“是否有意将其视为用于 I/O 或 IPC 目的的二进制数据?”,甚至“它是存储在 ASCII 中的已知个位数年龄吗?”。无论如何,如果某些东西最终可能会出现在寄存器中,那int就是自然的大小。

于 2012-12-18T05:17:58.910 回答
0

假设您正在为一个银行帐户实施一个程序。如果您提款过多(某些账户允许您提款,但会受到处罚),那么您将需要以某种方式表示负值。

于 2012-12-18T05:24:40.210 回答
0

我自己终于找到了一个很好的用例:

int是存储整数对数的完美候选,例如地图上的缩放级别。

short通常对此没有足够的精度(平滑鼠标滚轮的旋转可能非常精确),并且long通常比我们需要的精度更高。
我们肯定需要负值,所以我们不应该使用无符号类型。因此int符合要求。

于 2014-02-16T23:20:16.613 回答