Programming languages 为什么编程语言允许从整数到短整数的赋值?

Programming languages 为什么编程语言允许从整数到短整数的赋值?,programming-languages,strong-typing,weakly-typed,Programming Languages,Strong Typing,Weakly Typed,考虑到上面的例子,pascal语言确实允许从integer到shortint,甚至从longint到shortint的赋值,而无需显式类型转换。也就是说,pascal确实允许在类型类别内赋值(这里是整数类型) Pascal以其强类型而闻名,但为什么它允许这种弱类型的事情呢?我认为这种语法会鼓励不一致的代码 这种语法的优点是什么?除了著名的C和C+++之外,还有没有其他语言应用这种语法? 谢谢 编辑: 我只使用fpc/objfpc/tp/delphi模型测试了turbo pascal和free p

考虑到上面的例子,pascal语言确实允许从
integer
shortint
,甚至从
longint
shortint
的赋值,而无需显式类型转换。也就是说,pascal确实允许在类型类别内赋值(这里是整数类型)

Pascal以其
强类型
而闻名,但为什么它允许这种
弱类型
的事情呢?我认为这种语法会鼓励不一致的代码

这种语法的优点是什么?除了著名的C和C+++</P >之外,还有没有其他语言应用这种语法? 谢谢

编辑

我只使用fpc/objfpc/tp/delphi模型测试了
turbo pascal
free pascal
。此外,
gcc/g++
msvc
产生了相同的结果。也就是说,从
int
(在我的计算机上大小为4字节)分配到
short int int
(大小为2)不会引发任何编译错误,虽然您可以设置适当的选项,使编译器生成
可能丢失数据的警告。

我认为这种行为不是弱类型的,因为您永远无法获得指向真正指向
整数的
shortint
指针。它也不会导致崩溃(尽管第二个变量中的数值可能与您的预期不同)

你的意思是,显然,Pascal不会检查溢出。在例如C#中,您可以从代码()中设置检查行为,但这通常不是出于性能考虑。我假设帕斯卡也是如此。

第1部分。关于定义 首先,您将什么语言和实现称为“pascal”如果您正在谈论的是多年前已经过时的语言和实现。如果您正在谈论其他语言或实现,请提供更多信息

其次(正如Teun D已经提到的)术语“强类型”没有定义。看一看

然而,在计算的短暂历史中,这些术语被赋予了如此广泛的含义,以至于在断章取义的情况下,通常很难知道单个作者在使用它们时的含义

假设我们遵循Luca Cardelli在Wikipedia页面上的文章Typeful Programming中的定义:

LucaCardelli的文章Typeful编程将强类型描述为不存在未检查的运行时类型错误。在其他文字中,不存在未检查的运行时错误称为安全或类型安全;托尼·霍尔的早期论文称之为财产安全

无论如何,所描述的行为不能归类为静态(或安全)类型规程。我个人真的很讨厌这个嗯。。。这不是一个功能,这是一个bug

第二部分。答复 我认为问题不在于这种弱类型,而在于某些语言中可用的大量整数类型。

有没有其他语言应用这种语法,除了著名的C和C++?< /P> 我认为几乎所有具有各种整数类型的静态类型语言都有这样的行为。为了节省内存,在早年有这样的短音和爵士乐是个好主意。但是现在几乎每台PC都有1GB和更多的RAM。。。假设我们有100万个4字节的整数,而不是2字节的短整数。它只有大约4MB的内存,而不是2MB。我认为没有你描述的这些奇怪行为是合理的价格

快速查看一下沃思的Oberon-07()。只有一个整数类型-32位整数

还可以提到Python(或者是其他一些现代动态类型语言),它的int类型表示无限范围内的数字,只受可用(虚拟)内存的限制

所以你可以看到趋势-整数类型的多样性是70的生存

这种语法的优点是什么

优点是(可能)减少了冗长。这种静态类型的语言已经非常冗长了,因此如果我们决定添加一些显式的整数类型转换,就像Wirth在Oberon-2中所做的那样(看看SHORT()和LONG()函数),它们会变得更加冗长。作为折衷方案,可以允许隐式转换。此外,在许多语言中,整数类型变量的实际大小并不固定,并且在不同的实现中有所不同。唯一可用的信息是大小(shortint)=REAL>=LONGINT>=INTEGER>=shortint

在中,我们可以阅读有关作业的内容:

表达式必须与变量赋值兼容

最后在附录A中:

分配兼容

如果满足以下条件之一,则Te型表达式e与Tv型变量v的赋值兼容:

Te和Tv是同一类型

Te和Tv是数字类型,Tv包括Te

我们到了。不能将整数表达式指定给SHORTINT变量。如果你有兴趣,你也可以看看,小变种和完善的奥伯龙-2。是一个用于Windows的IDE


回应贾斯汀·史密斯的评论。

我很惊讶他说较大的类型包括较小类型的值:LONGREAL>=REAL>=LONGINT>=INTEGER>=SHORTINT,因为有些LONGINT不能表示为“REAL”s

我对你的说法有点困惑

有些渴望不能用“真实”来表达

实际上,在我的机器上,上面提到的IDE已经

最大(长)=9223372036854775807

最大(实际)=1.797693134862316E+308

所以你可以用实数来表示每一个LONGINT。但表示可能不精确。我想您实际上是在讨论它,但我们在这里讨论的是不同的整数t
program TypeCategory;
{$R+}
var
    sInt : shortint;
    iInt : integer;
begin
    readln(iInt);
    sInt := iInt;
    writeln(sInt);
end.
var
sInt : shortint;
iInt : integer;

if (iInt < 100 && iInt > -100)
{
   sInt := iInt; // this would not compile
}
var
sInt : shortint;
iInt : integer;

sInt := (iInt & 0xFFFF); // this would not compile
var
sInt1 : shortint;
sInt2 : shortint;
iInt : integer;

/* I want to multiply sInt2 by sInt1 and then divide by 100 */
iInt = sInt2;
sInt2 := (iInt * sInt1) / 100; // this would not compile
var x : 0..10;

x:=10;
x:=x+1; // runtime range check error  here.