¿Qué es el tipo de datos sin firmar?

4 minutos de lectura

he visto esto unsigned El tipo “sin tipo” se usó un par de veces, pero nunca se vio una explicación. Supongo que hay una correspondiente signed escribe. Aquí hay un ejemplo:

static unsigned long next = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}
void mysrand(unsigned seed) {
    next = seed;
}

Lo que he recopilado hasta ahora:
– en mi sistema, sizeof(unsigned) = 4 (insinúa un int sin firmar de 32 bits)
– podría usarse como abreviatura para convertir otro tipo a la versión sin firmar:

signed long int i = -42;
printf("%u\n", (unsigned)i);

¿Es esto ANSI C, o solo una extensión del compilador?

unsigned realmente es una abreviatura de unsigned inty así definido en el estándar C.

avatar de usuario
polaris878

unsigned medio unsigned int. signed medio signed int. Usando solo unsigned es una forma perezosa de declarar un unsigned int en C. Sí, esto es ANSI.

Históricamente en C, si omitía un tipo de datos, se asumía “int”. Entonces, “sin firmar” es una abreviatura de “int sin firmar”. Esto se ha considerado una mala práctica durante mucho tiempo, pero todavía hay una buena cantidad de código que lo usa.

  • No sabía que era una mala práctica. ¿Hay una razón para esto? long en lugar de long int es muy común, así que no estoy seguro de por qué unsigned en lugar de unsigned int no sería aceptable.

    –CB Bailey

    23 de julio de 2009 a las 19:41

  • @Charles Bailey: en estos días, al menos si está siendo pragmático en lugar de formal, long, int, short y char se consideran tipos de datos diferentes, ya que pueden tener diferentes tamaños) sin firmar (y por defecto, firmado) siendo un Calificatorio. Por lo tanto, tendería a usar “int sin firmar” de la misma manera que usaría “long sin firmar” o “char sin firmar” (y deja en claro que no se perdió el int). El int en “int largo” o “int corto” es superfluo.

    – Varilla

    25 de julio de 2009 a las 21:02

  • @Dipstick, “largo” es un calificador de “int”. Parece que el int en “int sin signo” es tan superfluo como el int en “int largo sin signo”.

    –Conrado Meyer

    12 de diciembre de 2014 a las 0:16

  • Esto no es lo mismo que la regla “int” implícita. Esta respuesta es engañosa.

    usuario3920237

    19 de enero de 2015 a las 23:43

C ª, unsigned es un atajo para unsigned int.

tienes lo mismo para long eso es un atajo para long int

Y también es posible declarar un unsigned long (Será un unsigned long int).

Esto está en el estándar ANSI.

avatar de usuario
Rabin Sah

En C y C++

unsigned = unsigned int (Integer type)
signed   = signed int (Integer type)

Un entero sin signo que contiene n bits puede tener un valor entre 0 y (2^n-1), que es 2^n valores diferentes.

Un entero sin signo es positivo o cero.

Los enteros con signo se almacenan en una computadora usando el complemento a 2.

avatar de usuario
Lundin

Según C17 6.7.2 §2:

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 elemento); los especificadores de tipo pueden ocurrir en cualquier orden, posiblemente entremezclados con los otros especificadores de declaración

– vacío
– char
– carácter firmado
– carácter sin firmar
— short, signed short, short int o signed short int
– int corto sin signo, o int corto sin signo
– int, firmado o firmado int
– int sin firmar o sin firmar
— long, signed long, long int o signed long int
– int largo sin signo o largo sin signo
— largo largo, firmado largo largo, largo largo int o firmado largo largo int
— sin signo largo largo o sin signo largo largo int
– flotar
– doble
– largo doble
— _Bool
— float _Complejo
— doble _Complejo
– largo doble _Complejo
– especificador de tipo atómico
— especificador de estructura o unión
– especificador de enumeración
– nombre de tipo definido

Así que en caso de unsigned int podemos escribir unsigned o unsigned into si nos sentimos locos, int unsigned. Esto último ya que el estándar es lo suficientemente estúpido como para permitir “… puede ocurrir en cualquier orden, posiblemente entremezclados”. Este es un defecto conocido del lenguaje.

Usos correctos del código C unsigned int.

avatar de usuario
Comunidad

Traigo mi respuesta de otra pregunta.

Desde el Especificación Capartado 6.7.2:

– int sin firmar o sin firmar

Significa que unsignedcuando no se especifica el tipo, por defecto será unsigned int. así que escribiendo unsigned a es lo mismo que unsigned int a.

¿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