gpt4 book ai didi

c++ - 为什么 size_t 是无符号的?

转载 作者:IT老高 更新时间:2023-10-28 13:24:16 25 4
gpt4 key购买 nike

Bjarne Stroustrup 在 C++ 编程语言中写道:

The unsigned integer types are ideal for uses that treat storage as a bit array. Using an unsigned instead of an int to gain one more bit to represent positive integers is almost never a good idea. Attempts to ensure that some values are positive by declaring variables unsigned will typically be defeated by the implicit conversion rules.

size_t 似乎是无符号的“以获得更多位来表示正整数”。那么这是一个错误(或权衡)吗?如果是,我们是否应该尽量减少在我们自己的代码中使用它?

Scott Meyers 的另一篇相关文章是 here .总而言之,他建议不要使用无符号接口(interface),无论该值是否始终为正。换句话说,即使负值没有意义,也不一定要使用无符号数。

最佳答案

size_t由于历史原因未签名。

在具有 16 位指针的体系结构上,例如“小型”模型 DOS 编程,将字符串限制为 32 KB 是不切实际的。

因此,C 标准要求(通过所需范围)ptrdiff_t , size_t 的签名拷贝和指针的结果类型不同,有效为17位。

这些原因仍然适用于嵌入式编程领域的某些部分。

但是,它们不适用于现代 32 位或 64 位编程,其中更重要的考虑是 C 和 C++ 不幸的隐式转换规则使无符号类型成为错误吸引器,当它们用于数字(因此,算术运算和幅度比较)。 20-20 事后看来,我们现在可以看到采用那些特定转换规则的决定,例如string( "Hi" ).length() < -3实际上可以保证,这是相当愚蠢和不切实际的。然而,这个决定意味着在现代编程中,对数字采用无符号类型有严重的缺点,没有任何优点——除了满足那些发现 unsigned 的人的感受。是一个 self 描述的类型名称,并没有想到typedef int MyType .

总结起来,这不是一个错误。出于当时非常合理、实用的编程原因,这是一个决定。这与将期望从像 Pascal 这样的边界检查语言转移到 C++ 没有任何关系(这是一种谬误,但非常普遍,即使其中一些人从未听说过 Pascal)。

关于c++ - 为什么 size_t 是无符号的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10168079/

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