当在我自己的代码中使用整数值时,我总是尝试考虑符号性,问自己整数是否应该有符号或无符号。
当我确定该值永远不需要为负数时,我会使用无符号整数。
我不得不说这种情况大多数时候都会发生。
在阅读其他人的代码时,我很少看到无符号整数,即使表示的值不能为负数。
所以我问自己:«这有充分的理由吗?或者人们只是使用有符号整数,因为他们不在乎»?
我在这里和其他地方都搜索过这个主题,我不得不说,我找不到一个在适用时不使用无符号整数的好理由。
我遇到了这些问题:«默认 int 类型:有符号还是无符号?», and «在 C 中,是否应该始终使用“int”来表示数字,即使它们是非负数?» 两者都提供了以下示例:
for( unsigned int i = foo.Length() - 1; i >= 0; --i ) {}
对我来说,这只是糟糕的设计。当然,这可能会导致无限循环,并且使用无符号整数。
但检查是否如此困难foo.Length()
是0,在循环之前?
所以我个人认为这不是一直使用有符号整数的好理由。
有些人可能还会说,即使对于非负值,有符号整数也可能有用,可以提供错误标志,通常-1
.
好的,有一个表示“错误”的特定值是很好的。
但是,像这样的事情有什么问题UINT_MAX
,对于那个具体值?
我实际上问这个问题是因为它可能会导致一些巨大的问题,通常是在使用第三方库时。
在这种情况下,您通常必须处理有符号和无符号值。
大多数时候,人们并不关心符号,而只是分配一个,例如,一个unsigned int
to a signed int
,不检查范围。
我不得不说我有点对编译器警告标志偏执,所以根据我的设置,这样的隐式转换将导致编译器错误。
对于此类内容,我通常使用函数或宏来检查范围,然后使用显式强制转换进行分配,如果需要则引发错误。
这对我来说似乎很合乎逻辑。
作为最后一个例子,因为我也是一名 Objective-C 开发人员(请注意,这个问题不仅仅与 Objective-C 有关):
- ( NSInteger )tableView: ( UITableView * )tableView numberOfRowsInSection: ( NSInteger )section;
对于那些不熟悉 Objective-C 的人来说,NSInteger
是一个有符号整数。
此方法实际上检索表视图中特定部分的行数。
结果将never是一个负值(顺便说一下,作为节号)。
那么为什么要使用有符号整数呢?
我真的不明白。
这只是一个例子,但我总是看到这样的东西,无论是 C、C++ 还是 Objective-C。
再说一次,我只是想知道人们是否不关心这类问题,或者是否最终有一个good and valid在这种情况下,有理由不使用无符号整数。
期待听到您的答案:)