首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于C语言族中符号整数的使用

关于C语言族中符号整数的使用
EN

Stack Overflow用户
提问于 2011-12-08 07:58:31
回答 5查看 1.3K关注 0票数 9

在我自己的代码中使用整数值时,我总是尝试考虑数字的特性,问自己整数应该是有符号的还是无符号的。

当我确信这个值永远不需要是负值时,我就使用一个无符号整数。

我不得不说,这种情况大多数时候都会发生。

在读取其他人的代码时,我很少看到无符号整数,即使表示的值不能是负值。

所以我问自己:有一个很好的理由吗?还是人们只使用有符号的整数,因为不关心

我已经搜索过这个主题,这里和其他地方,我不得不说,我找不到一个很好的理由不使用无符号整数,当它适用。

我遇到了这样的问题:默认int类型:已签名还是未签名?你应该总是用'int‘表示C中的数字,即使它们是非负的?,它们都给出了下面的示例:

代码语言:javascript
运行
复制
for( unsigned int i = foo.Length() - 1; i >= 0; --i ) {}

对我来说,这只是糟糕的设计。当然,它可能导致无限循环,带有无符号整数。

但是,在循环之前检查foo.Length()是否为0是如此困难吗?

所以我个人不认为这是一个很好的理由使用所有有符号整数。

有些人可能还会说,即使对于非负值,有符号整数也可能有用,可以提供一个错误标志,通常是-1

好的,这是很好的有一个特定的值,意味着错误。

但是,对于特定的值,像UINT_MAX这样的东西有什么问题呢?

我实际上是问这个问题,因为它可能会导致一些巨大的问题,通常在使用第三方库时。

在这种情况下,您通常需要处理已签名和无符号的值。

大多数情况下,人们只是不关心签名的问题,只是将一个unsigned int分配给一个signed int,而不检查范围。

我不得不说我有点带有编译器警告标志的偏执狂,所以在我的设置中,这样的隐式强制转换会导致编译器错误。

对于这类内容,我通常使用函数或宏来检查范围,然后使用显式强制转换进行赋值,在需要时引发错误。

这在我看来是合乎逻辑的。

作为最后一个例子,我也是一个Objective开发人员(请注意,这个问题与目标C无关):

代码语言:javascript
运行
复制
- ( NSInteger )tableView: ( UITableView * )tableView numberOfRowsInSection: ( NSInteger )section;

对于那些不通晓目标C的人,NSInteger是一个有符号整数.

此方法实际上检索特定节的表视图中的行数。

结果绝不是负值(顺便说一句,作为节号)。

那么,为什么要使用有符号整数呢?

我真的不明白。

这只是一个例子,但我总是看到这样的东西,用C,C++或Objective。

因此,我再次想知道,人们是否只是不关心这类问题,或者是否最终有一个好的和有效的理由不使用无符号整数来处理这种情况。

期待听到你的回答:)

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8427861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档