¿Cuál es el tipo de datos sin firmar?

90

He visto este unsignedtipo "sin tipo" usado un par de veces, pero nunca vi una explicación para ello. Supongo que hay un signedtipo correspondiente . He aquí 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 una forma abreviada para lanzar otro tipo a la versión sin firmar:

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

¿Es ANSI C o simplemente una extensión del compilador?

hhaamu
fuente

Respuestas:

144

unsignedrealmente es una abreviatura de unsigned int, y así se define en el estándar C.

Martin contra Löwis
fuente
30

unsignedsignifica unsigned int. signedsignifica signed int. Usar solo unsignedes una forma perezosa de declarar un unsigned inten C. Sí, esto es ANSI.

Polaris878
fuente
14

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


fuente
6
No sabía que era una mala práctica. ¿Existe una justificación para esto? longen lugar de long intes muy común, por lo que no estoy seguro de por qué en unsignedlugar de unsigned intno sería aceptable.
CB Bailey
10
@Charles Bailey: en estos días, al menos si está siendo pragmático en lugar de formal, se considera que long, int, short y char son tipos de datos diferentes, ya que pueden ser de diferentes tamaños) con unsigned (y el predeterminado, firmado) como un Calificatorio. Por lo tanto, tenderá a usar "unsigned int" de la misma manera que usaría "unsigned long" o "unsigned char" (y deja en claro que no se perdió el int). El int en "long int" o "short int" es superfluo.
Varilla de nivel
1
@Dipstick, "long" es un calificativo para "int". Parece que el int en "unsigned int" es tan superfluo como el int en "unsigned long int".
Conrad Meyer
1
Esto no es lo mismo que la regla implícita "int". Esta respuesta es engañosa.
7

en C, unsignedes un atajo para unsigned int.

Tienes lo mismo para longeso es un atajo paralong int

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

Esto está en el estándar ANSI

ThibThib
fuente
Si. unsignedes lo mismo que unsigned intpero hice una búsqueda en el Borrador del Comité WG14 / N1124 - 6 de mayo de 2005 ISO / IEC 9899: TC2 para unsignedy no pude encontrar dónde está definido ... ¿podría citar la parte donde está definido?
user454322
5

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 de 2.

Rabin Sah
fuente
2

Según C17 6.7.2 §2:

Cada lista de especificadores de tipo debe ser uno de los siguientes conjuntos múltiples (delimitado por comas, cuando hay más de un conjunto múltiple por elemento); los especificadores de tipo pueden aparecer en cualquier orden, posiblemente mezclados con los otros especificadores de declaración

- void
- char
- firmado char
- unsigned char
- short, firmado corto, short int o firmado short int
- unsigned short, o unsigned short int
- int, firmado o int firmado
- unsigned o unsigned int
- largo, firmado largo , int largo, o firmado largo int
- unsigned long, o unsigned long int
- long long, firmado long long, long long int, o firmado long long int
- unsigned long long, o unsigned long long int
- float
- double
- long double
- _Bool
- float _Complex
- double _Complex
- long double _Complex
- especificador de tipo atómico
- especificador de estructura o unión
- especificador de enumeración
- nombre typedef

Por lo que en caso de unsigned intque cualquiera puede escribir unsignedo unsigned int, o si estamos sintiendo loco, int unsigned. Esto último, dado 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 idioma.

Apropiados utiliza código C unsigned int.

Lundin
fuente
1

Trayendo mi respuesta de otra pregunta .

De la especificación C , sección 6.7.2:

- unsigned o unsigned int

Lo que significa que unsigned, cuando no se especifica el tipo, será predeterminado unsigned int. Entonces escribir unsigned aes lo mismo que unsigned int a.

Bruno Ferreira
fuente