Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 整数是64位C中的64位整数吗?_C#_64 Bit_32 Bit_Primitive - Fatal编程技术网

C# 整数是64位C中的64位整数吗?

C# 整数是64位C中的64位整数吗?,c#,64-bit,32-bit,primitive,C#,64 Bit,32 Bit,Primitive,在我的C#源代码中,我可能已将整数声明为: int i = 5; 或 在目前流行的32位世界中,它们是等效的。然而,当我们进入一个64位的世界时,我所说的以下内容将变得相同,对吗 int i = 5; Int64 i = 5; 不可以。C#规范严格定义了int是System.Int32的别名,正好是32位。改变这一点将是一个重大的突破性变化。是的,正如Jon所说,与“C/C++世界”不同,Java和C#不依赖于它们运行的系统。它们严格定义了字节/短/整数/长和单/双精度浮点的长度,在每个系统

在我的C#源代码中,我可能已将整数声明为:

int i = 5;

在目前流行的32位世界中,它们是等效的。然而,当我们进入一个64位的世界时,我所说的以下内容将变得相同,对吗

int i = 5;
Int64 i = 5;

不可以。C#规范严格定义了
int
System.Int32
的别名,正好是32位。改变这一点将是一个重大的突破性变化。

是的,正如Jon所说,与“C/C++世界”不同,Java和C#不依赖于它们运行的系统。它们严格定义了字节/短/整数/长和单/双精度浮点的长度,在每个系统上都相等。

无论您使用的是32位版本还是64位版本的CLR,在C#中,
int
总是意味着
系统。Int32
long
总是意味着
系统。在所有平台上,Int64
int
总是与
Int32
同义


微软不太可能在将来改变这一点,因为它将打破许多假定
int
为32位的现有代码。

C#中的
int
关键字被定义为
系统的别名。Int32
类型(根据名称判断)意味着是32位整数。根据规范:

第8.2.2节(内置值和参考类型)有一个包含以下内容的表格:

  • System.Int32
    -有符号32位整数
第8.2.1节(预定义类型)有一个类似的表格:

  • int
    -32位有符号整数类型

这保证了CLR中的
System.Int32
和C中的
int
始终是32位。

根据C规范的“11.1.4简单类型”一节,保留字
int
将别名为
System.Int32
。由于这是在规范中,所以不太可能更改。

我想您可能会被以下情况弄糊涂:
int
Int32
的别名,因此它始终是4个字节,但是
IntPtr
假定与CPU体系结构的字大小相匹配,因此在32位系统上为4字节,在64位系统上为8字节

sizeof(testInt)会是8吗

不,sizeof(testInt)是一个错误。testInt是一个局部变量。sizeof运算符需要一个类型作为其参数。这永远不会是8,因为它总是一个错误

VS2010将c#托管整数编译为4字节,即使在64位机器上也是如此

对。我注意到C规范的第18.5.8节将
sizeof(int)
定义为编译时常量4。也就是说,当你说
sizeof(int)
时,编译器只是将其替换为4;就好像你在源代码中说了“4”

有人知道C#中的标准“int”将是64位的时间是否/何时到来吗

从来没有。C#规范第4.1.4节规定,“int”是“System.Int32”的同义词


如果您想要的是“指针大小的整数”,则使用IntPtr。IntPtr根据不同的体系结构更改其大小。

不带后缀的int可以是32位或64位,具体取决于它所表示的值

如MSDN中所定义:

当整型文字没有后缀时,其类型是可以表示其值的第一种类型:int、uint、long和ulong

地址如下: 以下内容将在C#中显示:

sbyte有符号8位,1字节

字节无符号8位,1字节

short有符号16位,2字节

ushort无符号16位,2字节

int有符号32位,4字节

uint无符号32位,4字节

long有符号64位,8字节

ulong无符号64位,8字节

整数文本只是一个数字序列(例如314159),没有任何这些显式类型。C#在其适合的序列(intuintlongulong)中为其指定第一种类型。以上至少有一个回答似乎有点含糊不清

显示在一串数字之前的一元减号运算符(减号)不会将选择减少到(intlong)。文字总是正面的;减号实际上是一个运算符。所以想必
-314159
-((int)314159)
完全相同。除非显然有一个特殊情况,将
-2147483648
直接转换为int;否则它将是
-((uint)2147483648)
。我想这会让人不快


不知何故,预测C#(和朋友们)永远不会为>=128位整数的“软名称”类型而烦恼似乎是安全的。我们将获得对任意大整数的良好支持,以及对UInt128、UInt256等的超精确支持。只要处理器支持如此广泛的数学运算,并且几乎不使用任何运算。64位地址空间非常大。如果它们太小,可能是因为一些深奥的原因,比如ASLR或更高效的MapReduce之类的东西。

此外,据我所知,即使在x64中,只有指针和大小(size_t)是64位宽,而默认整数仍然是32位宽。Asaf:在一些依赖于编译器的语言中。例如,在C++中,64位GCC定义为64位长,而Visual C++则保持长为32位。C#不是这样一种语言,决策是标准化的,不留给编译器供应商。在C/C++世界中,INT依赖于编译器而不是底层硬件。大多数64位C++编译器仍然使用32位的int,但是指针将是64位而不是32位。在C世界中,它们实际上对C99的整个方案失去信心,决定不再长时间地获得,而是增加。
int i = 5;
Int64 i = 5;