为什么在许多语言中默认签署int类型的变量?

时间:2015-12-12 10:37:29

标签: c int programming-languages unsigned signed

C,C ++,C#,Java,Rust等默认签名为int。大多数时候你需要未签名的变量,因为你必须表示低于零的东西的情况比处理自然数的情况要少。此外,无符号变量不必以2的补码形式进行编码,并且对于额外的值范围,它们具有最高有效位。

考虑到所有这些因素,为什么语言的创建者会默认签名?

4 个答案:

答案 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默认有价值。