¿Es un int un entero de 64 bits en C # de 64 bits?


En mi código fuente de C# puedo haber declarado enteros como:

int i = 5;

O

Int32 i = 5;

En el mundo de 32 bits actualmente prevalente, son equivalentes. Sin embargo, a medida que nos movemos a un mundo de 64 bits, ¿estoy en lo cierto al decir que lo siguiente se convertirá en lo mismo?

int i = 5;
Int64 i = 5;
Author: Peter Mortensen, 2008-10-03

10 answers

No. La especificación C# define rígidamente que int es un alias para System.Int32 con exactamente 32 bits. Cambiar esto sería un cambio de ruptura mayor.

 45
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 21:15:18

La palabra clave int en C# se define como un alias para el tipo System.Int32 y esto (a juzgar por el nombre) está destinado a ser un entero de 32 bits. A la especificación:

Especificación CLI la sección 8.2.2 (Tipos de valor y referencia incorporados) tiene una tabla con lo siguiente:

  • System.Int32 - Entero de 32 bits con signo

Especificación de C# la sección 8.2.1 (Tipos predefinidos) tiene una tabla similar:

  • int - 32-bit firmado tipo integral

Esto garantiza que tanto System.Int32 en CLR como int en C# siempre serán de 32 bits.

 43
Author: Tomas Petricek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-14 18:51:30

Will sizeof(testInt) ever be 8?

No, sizeof(testInt) es un error. testInt es una variable local. El operador sizeof requiere un tipo como argumento. Esto nunca será 8 porque siempre será un error.

VS2010 compila un entero administrado en c# como 4 bytes, incluso en una máquina de 64 bits.

Correcto. Observo que la sección 18.5.8 de la especificación de C# define sizeof(int) como la constante en tiempo de compilación 4. Es decir, cuando se dice sizeof(int) el el compilador simplemente reemplaza eso con 4; es como si hubieras dicho " 4 " en el código fuente.

¿Alguien sabe si/cuándo llegará el momento en que un "int" estándar en C# será de 64 bits?

Nunca. La sección 4.1.4 de la especificación C# establece que " int "es sinónimo de " System. Int32".

Si lo que desea es un "entero del tamaño de un puntero", utilice IntPtr. Un IntPtr cambia su tamaño en diferentes arquitecturas.

 17
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-14 20:50:54

int es siempre sinónimo de Int32 en todas las plataformas.

Es muy poco probable que Microsoft cambie eso en el futuro, ya que rompería mucho código existente que asume que int es de 32 bits.

 11
Author: BlueRaja - Danny Pflughoeft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-17 02:07:03

Creo que lo que puede confundirle es que int es un alias para Int32 por lo que siempre será de 4 bytes, pero IntPtr se supone que coincide con el tamaño de palabra de la arquitectura de la CPU, por lo que será de 4 bytes en un sistema de 32 bits y 8 bytes en un sistema de 64 bits.

 5
Author: Brian Gideon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-14 19:00:30

De acuerdo con la especificación de C# ECMA-334, sección "11.1.4 Tipos simples", la palabra reservada int se alias a System.Int32. Dado que esto está en la especificación, es muy poco probable que cambie.

 4
Author: Jess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-14 18:48:39

No importa si está utilizando la versión de 32 bits o la versión de 64 bits del CLR, en C# an int siempre significará System.Int32 y long siempre significará System.Int64.

 3
Author: Mark Cidade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-02 21:28:38

Lo siguiente siempre será verdadero en C#:

Sbyte firmado 8 bits, 1 byte

Byte 8 bits sin signo, 1 byte

Corto firmado 16 bits, 2 bytes

Ushort unsigned 16 bits, 2 bytes

Int firmado 32 bits, 4 bytes

Uint unsigned 32 bits, 4 bytes

Long firmado 64 bits, 8 bytes

Ulong unsigned 64 bits, 8 bytes

An integer literal es solo una secuencia de dígitos (eg 314159) sin ninguno de estos tipos explícitos. C# se asigna el primer tipo en la secuencia (int, uint, largo, ulong) en el que encaja. Esto parece haber sido ligeramente confuso en al menos una de las respuestas anteriores.

Extrañamente el operador unario menos (signo menos) que aparece antes de una cadena de dígitos hace no reducir la elección a (int, long ). El literal es siempre positivo; el signo menos es realmente un operador. Así que, presumiblemente, -314159 es exactamente lo mismo que -((int)314159). Excepto que aparentemente hay un caso especial para obtener -2147483648directamente en un int; de lo contrario sería -((uint)2147483648). Lo que supongo que hace algo desagradable.

De alguna manera parece seguro predecir que C# (y sus amigos) nunca se molestarán con tipos de "nombre blando" para enteros >=128 bits. Vamos a conseguir un buen apoyo para arbitrariamente enteros grandes y soporte súper preciso para UInt128, UInt256, etc. tan pronto como los procesadores soportan hacer matemáticas tan amplias, y casi nunca usan nada de ellas. los espacios de direcciones de 64 bits son realmente grandes. Si alguna vez son demasiado pequeños será por alguna razón esotérica como ASLR o un MapReduce más eficiente o algo así.

 1
Author: PreventRage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-04 05:03:05

Sí, como dijo Jon, y a diferencia del 'mundo C/C++', Java y C# no dependen del sistema en el que se ejecutan. Tienen longitudes estrictamente definidas para flotadores de precisión byte/short/int/long y single/double, iguales en cada sistema.

 0
Author: zappan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-27 18:45:20

Int sin sufijo puede ser 32bit o 64bit, depende del valor que representa.

Como se define en MSDN:

Cuando un entero literal no tiene sufijo, su tipo es el primero de estos tipos en el que se puede representar su valor: int, uint, long, ulong.

Aquí está la dirección: https://msdn.microsoft.com/en-us/library/5kzh1b5w.aspx

 0
Author: House.Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-20 23:31:12