Palabra clave sin firmar en C ++

87

¿La palabra clave sin firmar tiene por defecto un tipo de datos específico en C ++? Estoy tratando de escribir una función para una clase para el prototipo:

unsigned Rotate(unsigned object, int count)

Pero realmente no entiendo lo que unsignedsignifica. ¿No debería ser como unsigned into algo así?

Cristal
fuente

Respuestas:

92

Desde el enlace de arriba:

Varios de estos tipos se pueden modificar utilizando las palabras clave firmadas, no firmadas, cortas y largas. Cuando uno de estos modificadores de tipo se usa solo, se asume un tipo de datos de int

Esto significa que puede asumir que el autor está usando ints.

futureelite7
fuente
¿C99 y MISRA pueden hacerlo?
nowox
42

Tipos de enteros:

short            -> signed short
signed short
unsigned short
int              -> signed int
signed int
unsigned int
signed           -> signed int
unsigned         -> unsigned int
long             -> signed long
signed long
unsigned long

Tenga cuidado con el carbón:

char  (is signed or unsigned depending on the implmentation)
signed char
unsigned char
Martin York
fuente
1
@Firas: Sé que está en C.Implicit int no es parte de ISO C99 ni de ISO C ++
Prasoon Saurav
4
El uso de 'unsigned' (por sí mismo) para declarar el tipo 'unsigned int' es estándar en C ++. En el estándar actual: 7.1.5.2 [dcl.simple.type] tiene una tabla que identifica cada declaración de tipo con el tipo real utilizado. Esa tabla tiene una correspondencia entre la declaración 'unsigned' y el tipo 'unsigned int'.
David Rodríguez - dribeas
2
Tenga en cuenta que char tiene un comportamiento idéntico al char firmado o al char sin firmar, pero sigue siendo un tipo separado pase lo que pase.
@Firas: Ver Sección: 3.9.1 Tipos fundamentales. Párrafo 2: <quote> Hay cinco tipos de enteros con signo estándar: "firmado char", "short int", "int", "long int" y "long long int". </quote>
Martin York
21

¿La palabra clave sin firmar tiene un tipo de datos predeterminado en C ++?

Sí, con y sin firmar también se pueden usar como especificadores de tipo independientes

Los tipos de datos enteros char, short, long e int pueden estar firmados o sin firmar, dependiendo del rango de números necesarios para representarlos. Los tipos con signo pueden representar valores positivos y negativos, mientras que los tipos sin signo solo pueden representar valores positivos (y cero).

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

Sin embargo, firmado y sin firmar también se pueden usar como especificadores de tipo independientes, lo que significa lo mismo que con int firmado y unsigned int respectivamente. Las siguientes dos declaraciones son equivalentes:

unsigned NextYear;
unsigned int NextYear;
Prasoon Saurav
fuente
3
¿No es eso un "sí", entonces? Por defecto es int, si se usa sin un tipo?
relajarse
¡Gracias! El inglés no es mi primer idioma y estaba desconcertado con el significado del tipo de datos sin firmar. ¿De quién es la firma que contiene? Nunca se me ocurrió que podría ser del signo sustantivo ...: D
user74200
Las palabras clave shorty longtambién son modificadores de tipo . Si escribe short s, eso significa en realidad short int s, como en unsigned urealidad significa unsigned int u. (y unsigned shortmedios unsigned short int)
Ben Voigt
8

Puede leer sobre la palabra clave unsigned en la Referencia de C ++ .

Hay dos tipos diferentes en este asunto, firmados y no firmados. El valor predeterminado para los números enteros está firmado, lo que significa que pueden tener valores negativos.

En un sistema de 32 bits, un número entero es de 32 bits, lo que significa que puede contener un valor de ~ 4 mil millones.

Y cuando se firma, esto significa que debe dividirlo, dejando -2 mil millones a +2 mil millones.

Sin embargo, cuando no está firmado, el valor no puede contener números negativos, por lo que para los números enteros esto significaría de 0 a +4 mil millones.

Hay un poco más de información sobre esto en Wikipedia .

Filip Ekberg
fuente
2
Me gusta chamuscarme para la mayoría de las cosas. ¡Delicioso carbón y carmelización!
Omnifarious
1
¿Qué tal editar errores tipográficos? ... ¡para eso está el botón "editar"!
Filip Ekberg
3

Sí, eso significa unsigned int. Solía ​​ser que si no especificaba un tipo de datos en C, había muchos lugares donde simplemente asumía int. Este fue el intento, por ejemplo, de tipos de retorno de función.

Esta verruga se ha erradicado en su mayoría, pero aquí se encuentran sus últimos vestigios. En mi humilde opinión, el código debe arreglarse para unsigned intevitar el tipo de confusión que está experimentando.

De todo género
fuente