Jon*_*Jon 56 c++ size-t unsigned-integer
Bjarne Stroustrup在C++编程语言中写道:
无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.
size_t似乎是无符号的"再获得一位代表正整数".那么这是一个错误(或权衡),如果是这样,我们应该在我们自己的代码中最小化它的使用吗?
Scott Meyers的另一篇相关文章就在这里.总而言之,他建议不要使用无符号in接口,无论值是否总是正数.换句话说,即使负值没有意义,也不一定要使用无符号.
Che*_*Alf 60
size_t
因历史原因未签名.
在具有16位指针的体系结构上,例如"小"模型DOS编程,将字符串限制为32 KB是不切实际的.
由于这个原因,C标准要求(通过所需范围)ptrdiff_t
,有符号对应点size_t
和指针差异的结果类型实际上是17位.
这些原因仍然适用于嵌入式编程领域的部分内容.
但是,它们不适用于现代32位或64位编程,其中一个更重要的考虑因素是C和C++的不幸隐式转换规则将无符号类型转换为bug吸引器,当它们用于数字时(和因此,算术运算和幅度比较).事后我们可以看到,20-20事后我们可以看到,采用这些特定转换规则的决定,例如string( "Hi" ).length() < -3
实际上得到保证,是相当愚蠢和不切实际的.然而,这个决定意味着在现代编程中,对数字采用无符号类型具有严重的缺点并且没有优点 - 除了满足那些发现unsigned
自我描述类型名称的人的感受,并且没有想到typedef int MyType
.
总结一下,这不是一个错误.这是一个非常合理,实用的编程原因的决定.它与从Pascal到C++这样的边界检查语言转移期望无关(这是一个谬论,但非常常见,即使有些人从未听说过Pascal).
gee*_*aur 26
size_t
是unsigned
因为负面尺寸毫无意义.
(来自评论:)
它不是那么确保,而是说明是什么.你最后一次看到大小为-1的列表是什么时候?遵循该逻辑过多,您会发现根本不存在无符号,也不应允许位操作.- geekosaur
更重要的是:地址,你应该考虑的原因,没有签署.通过比较地址生成大小; 将地址视为已签名将完成错误的操作,并且对结果使用带符号的值会丢失数据,使得您对Stroustrup引用的读取显然认为是可接受的,但事实上并非如此.也许你可以解释负面地址应该做什么.- geekosaur