2011-02-27 24 views
10
unsigned short a; 
    char temp[] = "70000"; 
    a = atoi(temp); 
    printf("a: %d\n", a); 

me da la salida a: 4464 cuando debería ser a: 70000 ¿Hay una mejor manera de convertir de ASCII a un decimal? El rango de un corto sin signo es 0 - 65535impresión valores cortos sin signo

Respuesta

8

Usted mismo está respondiendo la pregunta. El rango de unsigned short es 0-65535, entonces 70000 no encaja en él (2 bytes), use un tipo de datos con 4 bytes en su lugar (unsigned int debería funcionar, puede verificar el tamaño con sizeof).

+1

Bueno, esto es para mi tarea de ciencias de la computación y tenemos que usar el tipo de datos unsigned short – foo

+3

@mateo: Bueno, no se puede ajustar 70000 en 2 bytes, punto. Si la tarea te pide que lo intentes, la respuesta es "No puedo y tampoco puedes, maestro". Pero no es posible, así que vuelva a leer y cuéntenos la redacción exacta si desea que respondamos. – delnan

+2

En este caso, solo puede almacenar 70000 en dos cortos sin firmar, pero no en uno. Suena raro de hecho. – schnaader

8

Como schnaader said, es posible que se encuentre con un problema de desbordamiento.

Respondiendo a su pregunta printf sobre la salida de valores sin signo, desea el modificador u (para "sin firmar"). En este caso, como se señala a continuación Jens, desea %hu:

printf("a: %hu\n", a); 

... aunque solo %u (unsigned int, en lugar de unsigned short) probablemente funcionaría así, debido a que el short obtendrá promovido a int cuando se empuja en la pila para printf.

Pero, nuevamente, eso es solo si el valor 70000 cabrá en un unsigned short en su plataforma.

+6

'% hu' es el especificador correcto si' a' es 'unsigned short'. –

+0

@Jens: gracias. ¿El especificador 'h' se define en un estándar C? (No C++, no es un compilador específico). Mi recuerdo (¡que está oxidado!) Es que los valores 'cortos' se convierten a' int' cuando se los coloca en la pila en una situación varargs como 'printf'. Editar: obtengo el resultado esperado ('42, 60000, 42') a partir de esto, por ejemplo: http://pastie.org/1613793' gcc -Wall' no me dio ninguna advertencia (GCC 4.4.3). Pero, por supuesto, eso podría ser algo que, en alguna parte, me podría ayudar, podría ser específico de mi arquitectura o compilador, etc., etc. :-) –

+1

Sí, es C99. Y sí, el argumento se promueve a 'int' si' unsigned short' encaja en él, de lo contrario 'unsigned int'. Pero esto es solo una cosa diferente, el especificador de formato le dice a 'printf' cómo interpretar ese' int' que recibe. –

Cuestiones relacionadas