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++中,
sqrt
始终采用浮点类型(float、double或long double),并且该语言不包含任何无符号浮点类型。C99添加了csqrt
来处理complex
类型,但这些(同样)是基于浮点类型的,因为它们处理的是复数,无论如何,它们都可以从带有负实部的输入中产生完全合理的结果。系统级语言总是需要不同的有符号和无符号整数类型。这就是我们如何在硬件层面上获得效率 但是,无符号整数类型并不仅仅意味着“不负”。
除非使用无符号整数类型,否则应避免使用无符号整数类型 你需要2的恭维运算,或一个位模式 坚持使用有符号数字的主要动机是,当你混合使用有符号和无符号数字时,你会遇到麻烦。这些规则非常令人吃惊,在C++语言中,它们与bug有很强的关联。
相反,您应该依赖类型值的静态/动态检查,以确保它不是负数。系统级语言始终需要不同的有符号和无符号整数类型。
这就是我们如何在硬件层面上获得效率 但是,无符号整数类型并不仅仅意味着“不负”。
除非使用无符号整数类型,否则应避免使用无符号整数类型 你需要2的恭维运算,或一个位模式 坚持使用有符号数字的主要动机是,当你混合使用有符号和无符号数字时,你会遇到麻烦。这些规则非常令人吃惊,在C++语言中,它们与bug有很强的关联。
相反,您应该依靠静态/动态检查类型的值,以确保它不是负数。我知道我可能已经回答了自己的问题。尽管如此,我还是想知道除了泛滥之外还有什么其他原因。我知道我可能已经回答了我自己的问题。尽管如此,我还是想知道除了泛滥之外还有什么其他原因。回答得好。我只想补充一点,对于核心.NET方法,没有必要将有符号/无符号区分为类型签名,因为这会给本来只有整数/数字类型的语言增加不必要的复杂性。另一点是,.NET类具有边界检查,因此负索引将导致异常换句话说,你认为我应该用unsigned-in-other来避免负inpu吗