¿Es ‘largo sin firmar’ tan válido como ‘largo sin firmar’ en C?

3 minutos de lectura

¿Es largo sin firmar tan valido como largo sin firmar
paxdiablo

Recientemente se hizo una pregunta acerca de si ULL o LLU era válido para especificar constantes largas largas sin signo en C. Sé que ambos son válidos, pero estaba pensando que ULL sería preferible ya que coincidía con el tipo unsigned long long.

Sin embargo, ahora no estoy tan seguro. los gcc el compilador permitió lo siguiente sin quejarse:

int main(void) {
    unsigned int a = 1;
    int unsigned b = 2;
    return 0;
}

Entonces mi pregunta es: son int unsignedy otras variaciones como long long unsignedtipos válidos según la norma?

¿Es largo sin firmar tan valido como largo sin firmar
paxdiablo

La norma ISO C11 establece en 6.2.5 Types:

Hay cinco tipos de enteros con signo estándar, designados como char con signo, int corto, int, int largo y int largo largo.

Para cada uno de los tipos de enteros con signo, hay un tipo de entero sin signo correspondiente (pero diferente) (designado con la palabra clave no firmado) que utiliza la misma cantidad de almacenamiento (incluida la información de signos) y tiene los mismos requisitos de alineación.

Sin embargo, no hay ningún mandato en esa sección en cuanto a la pedido en el que el tipo base y unsigned aparece el modificador.

La sección de control está más adelante en el estándar, 6.7.2 Type specifiersparafraseado aquí:

Los especificadores de tipo son void, char, short, int, long, float, double, signed, unsigned, _Bool, _Complex, <struct-or-union-specifier>, <enum-specifier>y <typedef-name>.

Se debe proporcionar al menos un especificador de tipo en los especificadores de declaración en cada declaración, y en la lista de especificadores-calificadores en cada declaración de estructura y nombre de tipo. Cada lista de especificadores de tipo será uno de los siguientes conjuntos múltiples (delimitados por comas, cuando haya más de un conjunto múltiple por artículo); los especificadores de tipo pueden aparecer en cualquier orden, posiblemente entremezclados con los otros especificadores de declaración.

Luego pasa a enumerar todos los conjuntos múltiples, como unsigned long, or unsigned long int.

Pero la frase importante que hay the type specifiers may occur in any ordersignifica que todos de estos son válidos para ese multiset:

unsigned long
long unsigned

unsigned long int
unsigned int long
long unsigned int
long int unsigned
int unsigned long
int long unsigned

  • Para un ejemplo más oscuro, tenga en cuenta que typedef int i; y int typedef i; son equivalentes.

    – Mankarse

    25 de junio de 2013 a las 2:03

  • @Mankarse, buen punto, 6.7 le permite reordenar los especificadores de clase de almacenamiento como typedef y escriba especificadores como int. Tendría que mirar dos veces si alguna vez vi int typedef something En la naturaleza. Es casi seguro que rastrearía y destruiría a cualquiera que usara i como nombre de tipo 🙂

    – pax diablo

    25 de junio de 2013 a las 2:14

El orden del especificador no importa.

unsigned long long  is the same as long long unsigned.  

Ambos tipos son válidos según el estándar C (c99).

  • ¿Se cita esto de algún lugar en particular o simplemente lo puso en un cuadro de cotización?

    – Patatas

    25 de junio de 2013 a las 2:19

  • No es un cuadro de cotización, es un cuadro de código. Pero una atribución estaría bien.

    –Keith Thompson

    25 de junio de 2013 a las 3:17

  • @haccks No veo nada relevante en esa página. Gracias por hacerme perder más tiempo. -1

    – Patatas

    25 de junio de 2013 a las 3:32

  • @Potatoswatter; He leído esto recientemente en el libro que estoy siguiendo. No pensé que gastar tiempo para aprender algo es perder el tiempo.

    – trucos

    25 de junio de 2013 a las 9:06

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad