何时使用无符号数据类型?

时间:2013-08-07 19:30:49

标签: c types unsigned

我们什么时候需要使用无符号数据类型和C中的签名数据类型?我想知道为什么我们这样做以及如何决定我们需要哪一个。

3 个答案:

答案 0 :(得分:4)

当您需要变量保存负值时,请使用签名数据类型。注意溢出,因为有符号整数溢出会导致未定义的行为。

当您知道变量仅包含非负值或位模式时,请使用无符号数据类型。通常,它们可以保持比相同大小的签名数据类型更高的最大值。无符号整数溢出将环绕。

答案 1 :(得分:0)

只要你肯定你的价值总是积极的,你就应该使用unsigned int。另请注意,unsigned int的最大值为2^32 - 1,而签名int的最大值为2^31 - 1,因为第一位指定了该符号。

答案 2 :(得分:0)

有一种思路(我经常试图遵守),unsigned只应该用于真正没有符号概念的实体。例如,在机器状态寄存器中,每个位都有一个含义,但寄存器值作为一个整体没有可能的符号。因此,你应该使用unsigned来表示这些值。

对于所有其他内容,请使用signed

unsigned的问题在于,当与算术结合使用时,编译器必须进行一些转换。这些可能是非直观的,可能导致不正确或意外的算术结果。这是一篇关于这个主题的小文章:http://soundsoftware.ac.uk/c-pitfall-unsigned

这个建议的问题在于标准库不遵循它。许多函数采用size参数(例如strncpy)或返回size类型size_t(例如strlen),这是无符号的。我相信,这是无符号的逻辑,它允许大小达到处理器的最大地址空间。

所以最好的选择是什么有点令人困惑。编译器可以警告您签名转换 - 请参阅https://www.gnu.org/software/gsl/manual/html_node/GCC-warning-options-for-numerical-programs.html