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