es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿No hay advertencia de gcc cuando un literal declarado como long se asigna a un int en c?

Puedo compilar y ejecutar un programa que asigna un literal de tipo long int, aunque sea uno que quepa en una variable int.

$ cat assign-long-to-int.c

#include <stdio.h>

int main(void){
  int i = 1234L;        //asignar long a int
  printf("i: %d\n", i);
  return 0;
}
$ gcc assign-long-to-int.c -o assign-long-to-int
$ ./assign-long-to-int 
i: 1234

Sé que 1234 cabría en un int, pero aún esperaría ser capaz de habilitar una advertencia. He revisado todas las opciones de gcc, pero no encuentro nada adecuado.

¿Es posible generar una advertencia para esta situación? De la discusión aquí y las opciones de gcc, la respuesta corta es no. No es posible.

¿Habría algún punto en tal advertencia?
Es obvio en el ejemplo trivial que publiqué que 1234L se está asignando a una variable int y que cabrá. Sin embargo, ¿qué pasaría si la declaración y la asignación estuvieran separadas por muchas líneas de código? El programador que escribe 1234L está indicando que espera que este entero literal se asigne a un long. De lo contrario, ¿cuál es el punto de agregar la L?

En algunas situaciones, agregar la L sí marca la diferencia. Por ejemplo:

$ cat sizeof-test.c

#include <stdio.h>

void main(void){
  printf("%ld\n", sizeof(1234));
  printf("%ld\n", sizeof(1234L));
}
$ ./sizeof-test
4
8

Aunque el compilador debe saber que 1234L cabría en un int de 4 bytes, lo coloca en un long de 8 bytes.

$ gcc -v
Usando las especificaciones integradas.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
NOMBRES_META_DE_DESTINO=nvptx-none:hsa
OBJETIVO_META_DE_DESTINO=1
Objetivo: x86_64-linux-gnu
Configurado con: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Modelo de hilos: posix
Versión de gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
</stdio.h></stdio.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Compilando y ejecutando un programa que asigna un literal de long int a una variable int

    Como experto en IT especializado en c, gcc, gcc-warning y gcc9, el siguiente programa demuestra cómo asignar un literal de long int a una variable int:

    #include <stdio.h>
    
    int main(void){
      int i = 1234L;        //asignar long a un int
      printf("i: %d\n", i);
      return 0;
    }
    

    Aunque 1234 cabría en un int, activar una advertencia sería beneficioso en algunas situaciones. Sin embargo, después de revisar todas las opciones de gcc, no parece haber una adecuada para esta situación.

    El programador que escribe 1234L está indicando que espera que este entero literal sea asignado a un long. Aunque 1234L podría caber en un int de 4 bytes, ocuparía 8 bytes como un long. Por lo tanto, agregar la L puede marcar una diferencia en algunas situaciones.

    En general, parece que no es posible generar una advertencia para esta situación, pero sería beneficioso en algunas instancias.</stdio.h>

Comments are closed.