2010-06-12 22 views
7

En C++ podemos hacer las primitivas unsigned. Pero siempre son positivos. ¿Existe también una forma de hacer variables negativas sin signo? Sé que la palabra unsigned significa "sin signo", por lo que tampoco es un signo menos (-). Pero creo que C++ debe proporcionarlo.Primitivas negativas sin signo?

+0

"unsigned" en C/C++ es realmente un sinónimo de nonnegative. –

+13

Simplemente suponga que representan números negativos. – AraK

+1

Pregunta interesante que nunca escuché antes. Desafortunadamente, la respuesta es no." –

Respuesta

4

No. unsigned solo puede contener números no negativos.

Si necesita un tipo que solo represente números negativos, debe escribir una clase usted mismo, o simplemente interpretar el valor como negativo en su programa.

(Pero ¿Por qué necesita un tipo así?)

+0

Entonces, si realmente quiero esto, ¿tendré que crear mi propia clase y sobrecargar al operador para simular un número negativo? –

+0

@KennyTM: si quiero usar la menor cantidad posible de memoria. –

+1

@Martijn: Parece una optimización prematura. ¿Cuántos de esos números necesitas? ¿Cuál es el rango de esos números? – kennytm

2

unsigned son números enteros positivos solamente. De 3.9.1 párrafo 3 de la norma 2003 C++:

El rango de valores no negativos de un tipo entero firmado es un subrango de la correspondiente unsigned tipo entero , y la representación valor de correspondiendo cada uno firmado/unsigned tipo será el mismo.

El principal objetivo de los tipos enteros sin signo es admitir la aritmética del módulo. Desde 3.9.1 párrafo 4:

Los enteros sin signo, declaró sin firmar, deberá obedecer las leyes de la aritmética módulo 2 n donde n es el número de bits en la representación de valores de ese tamaño particular de entero.

Usted es libre, por supuesto, de tratarlos como negativos si lo desea, solo tendrá que hacer un seguimiento de usted mismo de alguna manera (tal vez con una bandera booleana).

0

Creo que lo estás pensando de forma incorrecta.

Si desea un número negativo, no debe declarar la variable como sin signo.

Si su problema es el rango de valores, y quiere ese bit más, entonces podría usar un tipo de datos "más grande" (int 64 por ejemplo ...).

Luego, si usa código heredado, la creación de una nueva estructura puede resolver su problema, pero así es debido a su situación específica, C++ no debería manejarlo.

0

No se deje engañar por el nombre: Unsigned es a menudo mal interpretado como no negativo, pero las reglas para el idioma son diferentes ... probablemente un nombre mejor hubiera sido "bitmask" o "modulo_integer". Si crees que unsigned no es negativo, entonces las reglas de conversión implícita son una tontería (¿por qué una diferencia entre dos no negativos debe ser no negativa? ¿Por qué la adición de un no negativo y un entero debería ser no negativo?).

Es una pena que la biblioteca estándar de C++ cayera en ese malentendido porque, por ejemplo, vector.size() no tiene firma (absurdo si lo dice como el lenguaje en sí, en términos de bitmask o modulo_integer).Esta elección de tamaños tiene más que ver con los viejos tiempos de 16 bits que con la condición de no firmados y, en mi opinión, fue una elección terrible que todavía estamos pagando como errores.

+2

¿Qué beneficio le otorga a la realización de la fabricación de vector.size()? Nunca puede devolver un valor negativo. ¿Qué errores surgen exactamente por firmar/no firmar? Es un concepto bastante simple de tratar. – Puppy

+0

El error más común que observé es iterar de 0 a vector.size() - 1 que para un vector vacío es un número enorme. Otros posibles errores surgen del hecho de que a - b> 0 no es lo mismo que a> b. Tenga en cuenta que todo esto sucede porque sin signo para C++ significa más o menos "elemento de Z [n]" (Z [n] = enteros módulo n) y no tiene nada que ver con el signo. En su opinión, ¿tiene sentido que la cantidad de elementos en un vector sea un elemento de ese anillo? Ints sin firmar son realmente muy útiles ... pero NO como cantidades. – 6502

+1

Bien, entonces obtienes un valor inesperado. ¿Cómo es eso mejor que obtener un flujo inferior? Al menos de esta manera no estás destruyendo tu memoria. –

0

Pero creo que C++ debe proporcionarlo.

¿Por qué? ¿Crees que C++ debe proporcionar la capacidad de hacer que los números no negativos sean negativos? Eso es tonto.

Los valores sin firmar en C++ se definen como siempre no negativos. ¡Incluso envuelven alrededor de — en lugar de desbordar — en cero! (Y lo mismo en el otro extremo del rango)