C,C ++,C#,Java,Rust等默认签名为int
。大多数时候你需要未签名的变量,因为你必须表示低于零的东西的情况比处理自然数的情况要少。此外,无符号变量不必以2的补码形式进行编码,并且对于额外的值范围,它们具有最高有效位。
考虑到所有这些因素,为什么语言的创建者会默认签名?
答案 0 :(得分:5)
我认为你的基本要求是错误的。负数在现实生活中非常普遍。想想温度,银行账户余额,SO问题和答案分数......在计算中建模物理数据需要一种自然的方式来表达负数量。
确实,Brian Kernighan和Dennis Ritchie的 The C Programming Language 中的第二个例子是一个在华氏温度和Celcius量表之间转换温度的程序。这是他们第一个使用C语言的数字应用程序的例子。
数组大小确实是正数,但指针偏移在C中可能是负数。
其他语言(例如Ada)指定数值变量的范围,但算术计算仍假设0
处的连续性,并且此隐含负数。
C中指定的无符号算术实际上令人困惑:1U - 2U
大于0
,就像-1U
一样。将其设为默认值会非常直观!
答案 1 :(得分:2)
这是一个很长的路要走:
大约1960年(仅)在FORTRAN,ALGOL和LISP的第一个版本中签署了整数(和实数)。(COBOL是主要的例外。)同样适用于70年代的语言,如Pascal和BCPL。
EDSAC(1949)支持(仅)签名的数字。
事实上,如果支持 unsigned 整数的第一种语言,C就是一种。
那么......为什么语言的创建者会默认签名?
嗯,原因之一是在C时代之前,签名整数是唯一可用的。所以它很自然地成为默认值。
另一个原因是需要签名号码的用例实际上比你意识到的要常见得多。还有另一类用例,其中整数是否签名并不重要。
答案 2 :(得分:1)
在这篇文章中有人回答了你的问题: Default int type: Signed or Unsigned?
与该帖子中接受的答案相同:
在无符号整数上
有些人,包括一些教科书作者,建议使用unsigned 表示从不否定的数字的类型。这是有意的 作为一种自我记录的形式。但是,在C中,这样的优点 文档被它可以引入的真正错误所抵消。 考虑:
for (unsigned int i = foo.Length()-1; i >= 0; --i)
...此代码将会 永不终止!有时gcc会注意到这个bug并警告你,但是 经常不会。比较签名时会出现同样糟糕的错误 和无符号变量。基本上,C的类型推广计划会导致 无符号类型的行为与人们预期的不同。因此,使用断言记录变量是非负的。别 使用无符号类型。
答案 3 :(得分:0)
Python为默认的 签名的INT池 表示-128到127(可能是另一个范围,通过修改源代码,您可以使此池更大或更小)通过引用使用INT。它使得Python更快地完成这项工作,因为每当你需要一个超出该范围的INT时,它就必须使用新的INT对象。
而且,就个人而言,我通常使用负数作为坏事的回报值。
把它放在一起,我认为使用小的负数有很多变化,它使得signed int默认有价值。