无符号以防止负数

时间:2010-05-06 18:52:45

标签: language-agnostic unsigned

让我希望我可以做出这种非冒犯性的

事情就是这样:有时,在固定类型的语言中,我使用unsigned类型unsigned int等类型将方法和函数的输入限制为正数。

然而,大多数图书馆似乎并不这么认为。拿C#unsigned double。它是一个整数,即使它永远不会是负数。 C / C ++也是如此:string.Length输入是sqrtint。我知道有这样的原因...例如你的参数可能是从文件读取的(不知道为什么)你可能更喜欢直接将值发送到函数并检查后面的错误(或使用try-catch块)。

所以,我假设库的设计比我自己的代码更好。那么使用无符号数表示正数的原因是什么?这是因为当我们转换回签名类型时溢出?

4 个答案:

答案 0 :(得分:2)

在C& C的情况下C ++,很多库在unsigned输入语言之前就存在了,所以vanilla int就是可用的。对库的较新添加将使用无符号类型,例如size_t

在.NET的情况下,有些语言(例如Visual Basic)没有无符号整数的概念(至少作为语言特性 - 它们当然可以使用System.UInt32等类型)

答案 1 :(得分:2)

只是纠正你所说的一部分:在C和C ++中,sqrt总是采用浮点类型(float,double或long double),并且该语言不包含任何无符号浮点类型。 C99添加csqrt来处理complex类型,但这些(再次)基于浮点类型 - 并且由于它们处理复数,它们可以通过输入生成完全合理的结果无论如何,负面的实际部分。

答案 2 :(得分:0)

我通常倾向于为int寻找循环迭代器,除非我明确需要大值(在这种情况下,size_tssize_t可能是64位架构的更好选择) 。 部分因为unsigned更多的打字工作:)但是,当倒数时:

for(unsigned int i=100; i>=0; --i) 
{
    printf("%i\n");
}

猜猜会发生什么:)即使你没有想到负数,你也不能发出信号,如果它们发生的话。这有时非常不安全。

答案 3 :(得分:0)

系统级语言总是需要不同的有符号和无符号整数类型 这就是我们如何在硬件层面上获得效率。

但是,无符号整数类型并不仅仅意味着"不是负数"。
您应该避免使用无符号整数类型,除非
你需要2个恭维算术或比特模式。

坚持使用签名号码的主要动机是,当你混合有符号和无符号数字时,你会遇到麻烦。规则非常令人惊讶,在C ++这样的语言中,它们与错误高度相关。

您应该依赖静态/动态检查类型的值,以确保它不是负数。

相关问题