Sufijo C# detrás del literal numérico


Soy nuevo en C# y quiero entender cómo funcionan los valores. Si miro un valor entero normal, tiene 3 partes importantes: el tipo, el nombre y el valor.

int testInt = 3;
 |    |       |
Type Name   Value

Pero cuando veo un valor flotante me confunde un poco debido al sufijo F.

float testFloat = 3.0F;
  |      |        |  |
 Type   Name  Value Type

Ahora hay dos tipos en él, y sin el sufijo F el valor sería un doble. Pero ¿por qué sucede esto cuando puedo declarar la variable doble con

double testDouble = 3.0D;

El double como la primera palabra debe ser suficiente, ¿no? Lo mismo ocurre con el valor decimal con el sufijo M:

decimal testDecimal = 3.0M;

Entonces empieza a confundirme cuando se trata de los otros sufijos:{[13]]}

ulong bigOne = 2985825802805280508UL;

Usé ulong en una prueba anterior y sé que el u es para "sin signo" y permite que el valor sea dos veces más alto que lo normal. Luego obtienes la U de nuevo como sufijo y la L para literal como dijo Google. Como yo lo entiendo, "literales" son tipos de valor que contienen números. Pero lo que no entiendo es, ¿por qué esto ulong trabajar incluso sin el sufijo?

ulong bigOne = 2985825802805280508;

Entonces intenté algo diferente para entender la importancia del sufijo

byte testLong = 12312UL;

Esto no funcionó porque el valor es demasiado alto para byte (254) y el sufijo no lo convierte en una variable larga.

¿Por qué la primera palabra (tipo) no es suficiente para una declaración? La primera palabra debería ser suficiente para decir el tipo. ¿Es la mejor práctica dar siempre un sufijo a los valores?

Author: Peter Olson, 0000-00-00

3 answers

Estás confundiendo dos cosas diferentes aquí: {[13]]}

float testFloat = 3.0F;

El float le dice al compilador que la variable testFloat será un valor de coma flotante. El F le dice al compilador que el literal 3.0 es un float. El compilador necesita conocer ambas piezas antes de poder decidir si puede asignar el literal a la variable sin conversión o con una conversión implícita.

Por ejemplo, puedes hacer esto:

float testFloat = 3;

Y eso está bien. Porque el el compilador verá 3 como un entero literal, pero sabe que puede asignar eso a un flotador sin pérdida de precisión (esto es conversión implícita). Pero si haces esto:

float testFloat = 3.0;

3.0 es un doble literal (porque es el valor predeterminado sin sufijo) y no puede convertir implícitamente (es decir, automáticamente) un doble a un flotador porque un flotador tiene menos precisión. En otras palabras, la información podría perderse. Así que o le dices al compilador que es un literal flotador:

float testFloat = 3.0f;

O le dices que estás de acuerdo con cualquier pérdida de precisión mediante el uso de un explicit cast:

float testFloat = (float)3.0;
 24
Author: Matt Burland,
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-01-06 16:46:09

Todos1 las expresiones deben ser resolubles a un tipo. Así que la expresión 42 siempre necesita tener exactamente un tipo (sucede que es un int). No puede ser un int si lo asigna a una variable int y un double si lo asigna a un double. El contexto en el que se usa una expresión nunca es1 se utiliza para determinar a qué tipo se resuelve.

Esta es la razón por la que los literales numéricos pueden tener sufijos; es una forma de definir el tipo de eso expresión en esa expresión.

Tenga en cuenta que también hay conversiones implícitas entre muchos de los tipos numéricos, por lo que si escribe double d = 42; la expresión 42 es en realidad un entero , pero hay un operador de conversión implícito que se está realizando en él que lo convertirá en un double antes de la asignación.

1 Hay algunas excepciones aquí, como lambdas, a las que el tipo de la expresión depende de cómo se usa, y el método grupos; en un vacío estas expresiones no tienen tipo.

 10
Author: Servy,
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-01-06 20:00:13

Existe otra forma de declarar una variable sin especificar el tipo antes del nombre:

var myNumber = 10;

En este caso, el tipo de variable se definirá por el valor literal.

Si utiliza el tipo (double|float|int|...) en lugar de "var", el compilador hace una conversión de valor literal a tipo variable (cuando es posible).

Por lo tanto, creo que el sufijo es importante cuando se usa " var " para declarar variables y el tipo de valor literal no es el asociado predeterminado cuando el sufijo no es usado;

Hay otra razón cuando usar sufijo es demasiado útil, como en la situación en la que desea realizar conversiones implícitas en expresiones.

 2
Author: Gean Ribeiro,
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-01-06 16:53:13