让我希望我可以做出这种非冒犯性的
事情就是这样:有时,在固定类型的语言中,我使用unsigned
类型unsigned int
等类型将方法和函数的输入限制为正数。
然而,大多数图书馆似乎并不这么认为。拿C#unsigned double
。它是一个整数,即使它永远不会是负数。 C / C ++也是如此:string.Length
输入是sqrt
或int
。我知道有这样的原因...例如你的参数可能是从文件读取的(不知道为什么)你可能更喜欢直接将值发送到函数并检查后面的错误(或使用try-catch块)。
所以,我假设库的设计比我自己的代码更好。那么使用无符号数表示正数的原因是什么?这是因为当我们转换回签名类型时溢出?
答案 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_t
或ssize_t
可能是64位架构的更好选择) 。
部分因为unsigned
更多的打字工作:)但是,当倒数时:
for(unsigned int i=100; i>=0; --i)
{
printf("%i\n");
}
猜猜会发生什么:)即使你没有想到负数,你也不能发出信号,如果它们发生的话。这有时非常不安全。
答案 3 :(得分:0)
系统级语言总是需要不同的有符号和无符号整数类型 这就是我们如何在硬件层面上获得效率。
但是,无符号整数类型并不仅仅意味着"不是负数"。
您应该避免使用无符号整数类型,除非
你需要2个恭维算术或比特模式。
坚持使用签名号码的主要动机是,当你混合有符号和无符号数字时,你会遇到麻烦。规则非常令人惊讶,在C ++这样的语言中,它们与错误高度相关。
您应该依赖静态/动态检查类型的值,以确保它不是负数。