0

希望我能让这个不主观

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

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

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

4

4 回答 4

2

在 C 和 C++ 的情况下,很多库在unsigned进入语言之前就已经存在,所以 vanillaint是可用的。新添加的库将使用无符号类型,例如size_t.

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

于 2010-05-06T19:02:07.220 回答
2

只是为了纠正您所说的一部分:在 C 和 C++ 中,sqrt始终采用浮点类型(float、double 或 long double),并且该语言不包括任何无符号浮点类型。C99 增加csqrt了处理complex类型,但这些(再次)基于浮点类型 - 由于它们处理复数,因此无论如何它们都可以从具有负实部的输入中产生完全合理的结果。

于 2010-05-06T19:24:59.730 回答
0

我通常倾向于使用intfor 循环迭代器,除非我明确需要大值(在这种情况下size_t,或者ssize_t考虑到 64 位架构,这可能是一个更好的选择)。部分原因unsigned是打字工作更多:)而且,倒计时时:

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

猜猜会发生什么 :) 即使您不期望负数,如果它们发生,您也无法发出信号。这有时是非常不安全的。

于 2010-05-06T19:08:15.220 回答
0

系统级语言总是需要不同的有符号和无符号整数类型。
这就是我们能够在硬件级别获得效率的方式。

但是,无符号整数类型,并不仅仅意味着“非负数”。
您应该避免使用无符号整数类型 ,除非
您需要 2 的补码算法或位模式。

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

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

于 2016-06-09T04:51:07.830 回答