2010-04-03 16 views
5

que tienen el código:¿Por qué la conversión de un size_t a un int sin firmar me da una advertencia?

unsigned int length = strlen(somestring); 

Estoy compilando con el nivel de advertencia en 4, y me dice que "la conversión de size_t a unsigned int, posible pérdida de datos" cuando un size_t es un typedef para una unsigned int.

¿Por qué?

Editar:

simplemente he resuelto mi problema. Soy un usuario de XP y mi compilador comprobaba la compatibilidad de 64 bits. Como size_t depende de la plataforma, para 64 bits sería unsigned long long, donde no es lo mismo que unsigned int.

+1

Todos los tamaños son dependientes. 'size_t' no tiene que ser igual a ningún otro tipo, todos podrían ser diferentes. La única garantía que tienes es que 'sizeof (char) == 1', y que el número de bits en un' char' (¡que también es dependiente!) Se define en la macro 'CHAR_BIT' en el encabezado' ', y que 'sizeof (short)> = sizeof (char)', 'sizeof (int)> = sizeof (long)', y 'sizeof (long long)> = sizeof (long)'. – GManNickG

+0

@GMan: en realidad creo 'sizeof (long)> = sizeof (int)' :) +1 aunque –

+0

@Billy: Oh, dangit. Ahora es demasiado tarde para arreglarlo. -_- Oh bien. : 3 – GManNickG

Respuesta

8

Porque unsigned int es un tipo más estrecho en su máquina que size_t. Lo más probable es que size_t tenga 64 bits de ancho, mientras que unsigned int tenga 32 bits de ancho.

EDITAR: size_t no es un typedef para unsigned int.

+0

Bueno, 'size_t' _is_ a typedef para' unsigned' en algunos sistemas. Sin embargo, no estará en los sistemas LP64 y LLP64. :-) –

+0

@James McNellis: Tal vez, pero el estándar no lo define de esa manera :) –

Cuestiones relacionadas