tipos tipo sirve rangos que programacion para float ejemplos datos dato c casting integer variable-assignment long-integer

c - sirve - tipos de variables en java netbeans



¿Qué sucede cuando asigno long int a int en C? (2)

El lenguaje garantiza que int es al menos 16 bits, long es al menos 32 bits y long puede representar al menos todos los valores que int puede representar.

Si asigna un valor long a un objeto int , se convertirá implícitamente. No hay necesidad de un molde explícito; simplemente se especificará la misma conversión que va a suceder de todos modos.

En su sistema, donde int y long tienen el mismo tamaño y rango, la conversión es trivial; simplemente copia el valor.

En un sistema donde long es más ancho que int , si el valor no cabe en un int , el resultado de la conversión está definido por la implementación. (O bien, a partir de C99, puede generar una señal definida por la implementación, pero no conozco ningún compilador que realmente lo haga). Lo que normalmente sucede es que los bits de orden superior se descartan, pero no se debe depender en ese. (Las reglas son diferentes para los tipos sin firmar, el resultado de convertir un entero con o sin firma a un tipo sin firmar está bien definido).

Si necesita asignar de manera segura un valor long a un objeto int , puede verificar que encajará antes de realizar la tarea:

#include <limits.h> /* for INT_MIN, INT_MAX */ /* ... */ int i; long li = /* whatever */ if (li >= INT_MIN && li <= INT_MAX) { i = li; } else { /* do something else? */ }

Los detalles de "otra cosa" dependerán de lo que quieras hacer.

Una corrección: int y long son siempre tipos distintos, incluso si tienen el mismo tamaño y representación. Los tipos aritméticos son libremente convertibles, por lo que a menudo no hace ninguna diferencia, pero por ejemplo int* y long* son tipos distintos e incompatibles; no puede asignar un long* a un int* , o viceversa, sin un molde explícito (y potencialmente peligroso).

Y si encuentra que necesita convertir un valor long a int , lo primero que debe hacer es reconsiderar el diseño de su código. En ocasiones, dichas conversiones son necesarias, pero con mayor frecuencia son una señal de que la int a la que está asignando debería haberse definido como una en primer lugar.

En una tarea reciente, me dijeron que use long variable long para almacenar un resultado, ya que puede ser un número grande.

Decidí comprobar que realmente me importa, en mi sistema (intel core i5 / 64-bit windows 7 / gnu gcc compilador) y descubrí que el siguiente código:

printf("sizeof(char) => %d/n", sizeof(char)); printf("sizeof(short) => %d/n", sizeof(short)); printf("sizeof(short int) => %d/n", sizeof(short int)); printf("sizeof(int) => %d/n", sizeof(int)); printf("sizeof(long) => %d/n", sizeof(long)); printf("sizeof(long int) => %d/n", sizeof(long int)); printf("sizeof(long long) => %d/n", sizeof(long long)); printf("sizeof(long long int) => %d/n", sizeof(long long int));

produce el siguiente resultado:

sizeof(char) => 1 sizeof(short) => 2 sizeof(short int) => 2 sizeof(int) => 4 sizeof(long) => 4 sizeof(long int) => 4 sizeof(long long) => 8 sizeof(long long int) => 8

En otras palabras, en mi sistema, int y long son iguales, y lo que sea demasiado grande para que int contenga, también será demasiado grande para que lo sostenga demasiado long .

La tarea asignada no es el problema aquí. Me pregunto cómo, en un sistema donde int < long , ¿debería asignar un int a long?

Soy consciente del hecho de que there numerous preguntas closely related sobre este tema, pero creo que las respuestas que are no me proporcionan una comprensión completa de lo que sucederá o lo que sucederá en el proceso.

Básicamente, estoy tratando de descubrir lo siguiente:

  1. ¿Debo lanzar long int antes de la asignación, o desde hace long no es un tipo de datos diferente, sino simplemente un modificador, se considerará inofensivo asignar directamente?
  2. ¿Qué sucede en los sistemas donde long > int ? ¿El resultado será indefinido (o impredecible) o hará que las partes adicionales de la variable se omitan?
  3. ¿Cómo funciona el casting de long a int en C?
  4. ¿Cómo funciona la asignación de long a int en C cuando no uso casting?

Un long siempre puede representar todos los valores de int . Si el valor en cuestión se puede representar por el tipo de la variable que asigna, entonces el valor se conserva.

Si no se puede representar, para el tipo de destino firmado el resultado no se especifica formalmente, mientras que para el tipo de destino sin signo se especifica como el valor original módulo 2 n , donde n es el número de bits en la representación del valor (que no es necesariamente todos los bits en el destino).

En la práctica, en las máquinas modernas, también se ajusta para tipos firmados.

Esto se debe a que las máquinas modernas usan dos formas de complemento para representar enteros con signo, sin ningún bit usado para denotar "valor inválido" o tal, es decir, todos los bits usados ​​para la representación del valor.

Con la representación del valor de n bits, cualquier valor entero es x se asigna a x + K * 2 n con la constante entera K elegida de manera que el resultado se encuentre en el rango donde la mitad de los valores posibles son negativos.

Así, por ejemplo, con int 32 bits, el valor -7 se representa como el número de bitpattern -7 + 2 32 = 2 32 -7, de modo que si visualiza el número que bitpattern representa como entero sin signo, obtiene una bonita gran número.

La razón por la que esto se llama complemento de dos es porque tiene sentido para el sistema de numeración binario, el sistema de numeración de dos bases. Para el sistema de numeración binario también hay uno (observe la ubicación del apóstrofo) complemento. De manera similar, para el sistema numérico decimal hay complemento de diez y complemento de niners. Con la representación de complemento de diez dígitos de diez representarías -7 como 10000-7 = 9993. Eso es todo, realmente.