2010-01-20 22 views
72

¿La palabra clave unsigned está predeterminada en un tipo de datos específico en C++? Estoy tratando de escribir una función para una clase para el prototipo:Palabra clave sin firmar en C++

unsigned Rotate(unsigned object, int count) 

Pero yo realmente no entiendo lo unsigned medios. ¿No debería ser como unsigned int o algo así?

Respuesta

79

Desde el link arriba:

Varios de estos tipos se pueden modificar utilizando las palabras clave firmados, sin firmar, corta y larga. Cuando se utiliza uno de estos modificadores de tipo por sí mismo, se supone un tipo de datos de int

Esto significa que puede suponer que el autor está utilizando ints.

+0

¿Se permite C99 y MISRA para hacerlo? – nowox

7

Puede leer sobre la palabra clave unsigned in the C++ Reference.

Existen dos tipos diferentes en esta materia, firmados y sin firmar. El valor predeterminado para enteros está firmado, lo que significa que pueden tener valores negativos.

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

Y cuando está firmado, esto significa que debe dividirlo, dejando -2 mil millones a +2 mil millones.

Cuando no está firmado, sin embargo, el valor no puede contener ningún número negativo, por lo que para los enteros esto significaría de 0 a +4 mil millones.

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

+2

Me gusta la mayoría de las cosas. Yummy carbon y carmelization! – Omnifarious

+1

¿Qué hay de editar errores tipográficos? ... eso es lo que el botón "editar" está ahí para! –

20

¿La palabra clave default sin firmar a un tipo de datos en C++

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

Los tipos de datos enteros Char, corto, largo y int puede ser firmado o no, dependiendo del rango de números necesario para ser representado. Los tipos firmados pueden representar valores tanto positivos como negativos, mientras que los tipos sin firmar 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 es 2 valores n diferentes).

Sin embargo, firmado y sin firmar también se puede utilizar como especificadores de tipo independientes, es decir, lo mismo que firm int y unsigned int respectivamente. Los siguientes dos declaraciones son equivalentes:

unsigned NextYear; 
unsigned int NextYear; 
+3

¿No es eso un "sí", entonces? ¿El valor predeterminado es int, si se usa sin un tipo? – unwind

+1

Tienes razón, editado. –

+0

¡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

35

tipos 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 de carbón:

char (is signed or unsigned depending on the implmentation) 
signed char 
unsigned char 
+1

@Firas: _Sé que está en C_ .Implicit int no es una parte de ISO C99 ni una parte de ISO C++ –

+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 de la declaración 'unsigned' al tipo 'unsigned int'. –

+1

Tenga en cuenta que char tiene el * comportamiento * idéntico a char firmado o char sin signo, pero sigue siendo un tipo separado sin importar qué. –

3

sí, significa unsigned int. Solía ​​ser que si no especificaba un tipo de datos en C, había muchos lugares donde simplemente asumió int. Esto fue intentar, por ejemplo, de tipos de devolución de funciones.

Esta verruga ha sido erradicada en su mayoría, pero aquí encontrará sus últimos vestigios. En mi humilde opinión, el código debe ser corregido para decir unsigned int para evitar el tipo de confusión que está experimentando.