Language agnostic 无符号,以防止出现负数

Language agnostic 无符号,以防止出现负数,language-agnostic,unsigned,Language Agnostic,Unsigned,让我们希望我能使这个非主观化 事情是这样的:有时,在固定类型语言上,我通过使用无符号类型(如无符号int或无符号double)将方法和函数的输入限制为正数 然而,大多数图书馆似乎不是这样想的。以C#字符串为例。长度。它是一个整数,即使它永远不可能是负数。C/C++也是如此:sqrt输入是int或double。我知道这是有原因的。。。例如,您的参数可能是从文件中读取的(不知道为什么),您可能更喜欢直接将值发送到函数,然后检查错误(或使用try-catch块) 所以,我假设库的设计要比我自己的代码好

让我们希望我能使这个非主观化

事情是这样的:有时,在固定类型语言上,我通过使用
无符号
类型(如
无符号int
无符号double
)将方法和函数的输入限制为正数

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


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

> P+>在C+C++的情况下,在代码>未签名< /C> >之前,有许多库存在,所以香草>代码> INT/COM>是所有可用的。较新的库添加将使用未签名类型,如
size\u t


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

< P>在C+C++的情况下,许多代码库在代码>未签名< /C> >之前已经存在,所以香草
int
是所有可用的。较新的库添加将使用未签名类型,如
size\u t


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

对于循环迭代器,我通常倾向于使用
int
,除非我明确需要较大的值(在这种情况下,
size\u t
ssize\u t
对于64位体系结构来说可能是更好的选择)。 部分原因是
未签名的
需要更多的打字工作:),但在倒计时时:

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

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

对于循环迭代器,我通常倾向于选择
int
,除非我明确需要大的值(在这种情况下,
size\u t
ssize\u t
可能是64位体系结构下更好的选择)。 部分原因是
未签名的
需要更多的打字工作:),但在倒计时时:

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

猜猜会发生什么:)即使你不期望出现负数,如果它们发生了,你也不能发出信号。这是非常不安全的。

< p>只是纠正你所说的一部分:在C和C++中, >RRT 总是采用浮点类型(浮点、双或长双),并且语言不包括任何未签名浮点类型。C99增加了CQRT 处理<代码>复数< /COD>类型,但是这些(又)是基于浮点类型的,并且由于它们处理复杂的数字,所以不管输入的实际部分是否都是可以产生完全合理的结果。

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

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

但是,无符号整数类型并不仅仅意味着“不负”。
除非使用无符号整数类型,否则应避免使用无符号整数类型 你需要2的恭维运算,或一个位模式

坚持使用有符号数字的主要动机是,当你混合使用有符号和无符号数字时,你会遇到麻烦。这些规则非常令人吃惊,在C++语言中,它们与bug有很强的关联。
相反,您应该依赖类型值的静态/动态检查,以确保它不是负数。

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

但是,无符号整数类型并不仅仅意味着“不负”。
除非使用无符号整数类型,否则应避免使用无符号整数类型 你需要2的恭维运算,或一个位模式

坚持使用有符号数字的主要动机是,当你混合使用有符号和无符号数字时,你会遇到麻烦。这些规则非常令人吃惊,在C++语言中,它们与bug有很强的关联。
相反,您应该依靠静态/动态检查类型的值,以确保它不是负数。

我知道我可能已经回答了自己的问题。尽管如此,我还是想知道除了泛滥之外还有什么其他原因。我知道我可能已经回答了我自己的问题。尽管如此,我还是想知道除了泛滥之外还有什么其他原因。回答得好。我只想补充一点,对于核心.NET方法,没有必要将有符号/无符号区分为类型签名,因为这会给本来只有整数/数字类型的语言增加不必要的复杂性。另一点是,.NET类具有边界检查,因此负索引将导致异常换句话说,你认为我应该用unsigned-in-other来避免负inpu吗