2010-04-03 13 views
5

mam kod:Dlaczego konwersja z size_t na unsigned int daje mi ostrzeżenie?

unsigned int length = strlen(somestring); 

mam kompilacją z poziomu ostrzegawczego na 4, a to mówi mi, że „konwersja z size_t do unsigned int, możliwa utrata danych” Kiedy size_t jest typedef dla unsigned int.

Dlaczego?

Edytuj:

Właśnie rozwiązałem mój własny problem. Jestem użytkownikiem XP, a mój kompilator sprawdzał kompatybilność 64-bitową. Ponieważ size_t jest zależny od platformy, dla 64-bitów będzie to unsigned long long, gdzie to nie jest tożsame z unsigned int.

+1

Wszystkie rozmiary są zależne. 'size_t' nie musi się równać z żadnym innym typem, wszystkie mogą być różne. Jedyna gwarancja jaką masz to 'sizeof (char) == 1' oraz że liczba bitów w' char' (która jest również zależna!) Jest zdefiniowana w makro 'CHAR_BIT' w nagłówku' ', i że 'sizeof (short)> = sizeof (char)', 'sizeof (int)> = sizeof (long)' i 'sizeof (long long)> = sizeof (long)'. – GManNickG

+0

@GMan: Właściwie uważam, że 'sizeof (long)> = sizeof (int)' :) +1 though –

+0

@Billy: Oh dangit. Teraz jest za późno, aby to naprawić. -_- No cóż. : 3 – GManNickG

Odpowiedz

8

Ponieważ unsigned int jest węższym typem na komputerze niż size_t. Najprawdopodobniej size_t ma szerokość 64 bitów, a unsigned int ma szerokość 32 bitów.

EDYCJA: size_t nie jest typedef dla unsigned int.

+0

Cóż, 'size_t' _is_ a typedef dla' unsigned' w niektórych systemach. Nie będzie jednak w systemach LP64 i LLP64. :-) –

+0

@James McNellis: Może, ale standard nie definiuje tego w ten sposób :) –

Powiązane problemy