C# 在C中,为什么是;int";System.Int32的别名?

C# 在C中,为什么是;int";System.Int32的别名?,c#,types,language-design,alias,C#,Types,Language Design,Alias,既然C#支持Int8、Int16、Int32和Int64,为什么语言设计者选择将int定义为Int32的别名,而不允许它根据本机体系结构认为是字的不同而有所不同 我对int的行为方式没有任何特别的需求,我只是出于纯粹的百科全书式的兴趣 我认为64位RISC架构是可以想象的,它将最有效地只支持64位量,并且32位量的操作将需要额外的操作。在一个程序坚持使用32位整数的世界里,这样的体系结构将处于不利地位,这是另一种说法,即C#成为未来和所有语言,从根本上阻止硬件设计师在未来提出这样的体系结构 St

既然C#支持
Int8
Int16
Int32
Int64
,为什么语言设计者选择将
int
定义为
Int32
的别名,而不允许它根据本机体系结构认为是
字的不同而有所不同

我对
int
的行为方式没有任何特别的需求,我只是出于纯粹的百科全书式的兴趣

我认为64位RISC架构是可以想象的,它将最有效地只支持64位量,并且32位量的操作将需要额外的操作。在一个程序坚持使用32位整数的世界里,这样的体系结构将处于不利地位,这是另一种说法,即C#成为未来和所有语言,从根本上阻止硬件设计师在未来提出这样的体系结构

StackOverflow不鼓励猜测答案,因此请仅在您的信息来源可靠时回答。我注意到SO的一些成员是微软内部人士,所以我希望他们能够在这个问题上给我们一些启发

注1:事实上,我阅读了所有的答案和所有的评论,但没有发现任何关于我在这个问题上问的原因的暗示


注2:此处讨论了SO问题的可行性(非决定性):

我认为其主要原因是针对CLR的程序的可移植性。如果他们允许像
int
这样的基本类型依赖于平台,那么为CLR制作可移植程序将变得更加困难。在平台无关的C/C++代码中,
typedef
-ed积分类型的激增,涵盖了内置
int
的使用,这间接暗示了为什么CLR的设计者决定让内置类型独立于平台。这样的差异是基于虚拟机的执行系统的“一次写入,随处运行”目标的一大障碍

Edit通常情况下,
int
的大小通过位运算而不是通过算术(毕竟,
i++
,对吧?)隐式地进入代码,但错误通常更微妙。考虑下面的例子:

const int MaxItem = 20;
var item = new MyItem[MaxItem];
for (int mask = 1 ; mask != (1<<MaxItem) ; mask++) {
    var combination = new HashSet<MyItem>();
    for (int i = 0 ; i != MaxItem ; i++) {
        if ((mask & (1<<i)) != 0) {
            combination.Add(item[i]);
        }
    }
    ProcessCombination(combination);
}
const int MaxItem=20;
var item=新的MyItem[MaxItem];

对于(整数掩码=1;掩码!=(1许多程序员倾向于为他们使用的平台编写代码。这包括对类型大小的假设。如果int的大小更改为16或64位,许多C程序都会失败,因为它们是在int为32位的假设下编写的。选择C#可以通过s避免这个问题暗示着这样定义。如果你根据平台将int定义为变量,你就会回到同一个问题。尽管你可能会认为程序员错误的假设是错误的,但这会使语言更加健壮(IMO)对于桌面平台而言,32位int可能是最常见的。此外,它使将本机C代码移植到C#变得更容易


编辑:我认为您编写的代码比您想象的更经常地对类型的大小进行(隐式)假设。基本上任何涉及序列化的内容(如.NET远程处理、WCF、将数据序列化到磁盘等)如果允许变量大小为int,则会给您带来麻烦,除非程序员通过使用特定的大小类型(如
int32
)来处理它。然后,您最终会得到“我们将始终使用int32以防万一”,而您什么也得不到。

如果您想要“机器字大小的类型”是的,但是我们倾向于用
int
s来做算术,而不是用
IntPtr
s。为什么要投反对票?是的,我希望那些投反对票的人已经看到了我在问题末尾链接到的关于meta的讨论。@Mike,你的第一个评论是关于钱的:我们倾向于用meta做算术
int
s。CLR设计者认为算术运算在所有受支持的平台上表现相同是可取的,如果大小(因此,范围)不同,则情况可能不同
int的
依赖于平台。好吧,我确信最终它归结为可移植性,但我不知道具体是如何实现的。你看,我们很少执行算术运算,其结果实际上取决于我们操作数的特定位长,对于那些罕见的情况,当我们实际执行此类运算时,该语言已经为我们提供了非常好的Int8、Int16、Int32、Int64和无符号版本。此外,编译器/JIT可以很容易地为我们的程序提供4字节机器字大小和8字节机器字大小的不同编译版本,以便我们可以在单个开发mac上在这两种情况下对其进行测试hine.@MikeNakis这似乎是一个很好的假设,但如果您为64位编码,然后尝试在32位上运行,则它会崩溃。关于最小和最大整数的假设可能会导致您的代码崩溃。它也可能会破坏为将整数解析/格式化为字符串而编写的自定义代码。请记住,这些环境的思想是更能保证可移植性我应该说得更清楚。
int
通常是许多开发人员使用的默认数据类型。如果开发人员不记得它可能会加倍为64位,那也没什么坏处(如您所说)。不记得它可以被减半到32位是危险的。@couling是的,我明白你的意思。这也是dasblinkenlight的话。好吧,dasblinkenlight,这是一个很好的答案。让我们睡几天吧,除非这个问题最终被揭穿或口误,否则我会接受你的答案。请看我的第一个com我