2012-04-01 29 views
10

He programado una clase llamada HugeInteger que puede hacer aritmética (agregar, sub, multiplicar) con números de tamaño "infinito". Trata cada bit del dígito en el número como un dígito independiente (por ejemplo, 1234 = 1, 2, 3 y 4). Guardo estos números en un vector (vector<short>). Ahora, debido a que cada dígito solo puede tomar los valores de 0 a 9, realmente no necesito almacenarlos como un dígito de 2 bytes. ¿Hay alguna forma (sin usar char) para almacenar los dígitos como un entero sin signo de 1 byte? ¡Gracias!entero de 1 byte sin signo C++

Actualización:

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << v[i]; 

Esto produce una salida no deseada. ¿Qué tipo de datos debo usar para iterar a través del vector?

+5

¿Por qué sin usar 'char'? – jwodder

+1

El encabezado proporciona un tipo llamado "uint8_t" - si su entorno admite dicho tipo. Tenga en cuenta que "uint8_t" puede ser un typedef para "char sin signo". Así que la sobrecarga puede no funcionar como se espera en todos los casos. – nosid

+3

'unsigned char' es el entero" sin bytes de un byte "de C++ por definición. ¿Por qué no quieres una solución a tu problema? –

Respuesta

21

Sí, use unsigned char.

Si <stdint.h> está disponible, entonces también puede usar uint8_t.

+0

'uint8_t' es un byte o un error de compilación. 'unsigned char' puede ser mayor que un byte (pero solo en sistemas donde' uint8_t' es un error de compilación). –

+1

@Ben: 'unsigned char' siempre es un" byte ", pero en el lenguaje C/C++, ese" byte "puede ser más de 8 bits (aunque generalmente solo en arquitecturas que se consideran inusuales para los estándares actuales). –

7

No dejes que el compilador estándar tipo char te confunda; La siguiente es perfectamente legal:

char number[5] = { 1, 4, 3, 6, 2}; // Representation of decimal 14,362 

No es que no hay nada especial sobre el tipo char que obliga a pensar en ellos como personajes; más bien, es su conveniente tamaño de solo 1 byte lo que los hace adecuados para contener valores que las rutinas de la biblioteca como printf usan para mantener los valores de 1 byte que interpretará como caracteres con una codificación adecuada.

+0

Sí, esto era nuevo para mí. Pensé que necesitaba comillas simples para cada char. ¡Gracias por el consejo! – raze

1

uint_least8_t es el tipo de datos más compacto para almacenar un solo dígito decimal.

Si su sistema es compatible con un tipo de datos de tamaño 1 byte, este será. De lo contrario, será el siguiente tipo de datos más pequeño disponible.

Es posible que deba emitir el valor cuando utilice un operador de inserción de flujo para asegurarse de obtener un resultado numérico en lugar de un tratamiento de caracteres.

1

La salida que se está viendo el uso de cout < < en un unsigned char se ha reducido a la mecánica del operador < < cuando se utiliza con un std :: ostream (en concreto, diferentes sobrecargas del operador < < mostrarán el valor de diferentes maneras: las sobrecargas char/unsigned suelen suponer que desea una representación de caracteres en lugar de una numérica)

La representación subyacente de su carácter sin signo sigue siendo el mismo número que introdujo en el vector - unsigned char sigue siendo un entero de 1 byte sin signo)

Si desea cambiar la salida, entonces usted necesita para evitar el uso de la sobrecarga del operador < < que está diseñado para carbón o unsigned char - la forma más fácil de hacerlo es llevar a cabo un reparto

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << static_cast<int>(v[i]); 
0

Usar char o unsigned char como tipo entero de 1 byte no siempre es tan sencillo ... A veces solo necesitas que el tipo sea de tipo numérico, no de tipo de carácter. Uno de estos ejemplos está aquí: 1 byte integer data type Otro es cuando tiene una función sobrecargada para argumentos de varios tipos diferentes.

Cuestiones relacionadas