2010-04-03 20 views
5

Ben kodu vardır:Neden bir size_t ile imzasız bir int dönüştürme, bana bir uyarı veriyor?

unsigned int length = strlen(somestring); 

Ben on 4 uyarı seviyesi ile derleme ve "dönüşüm size_t den unsigned int için, olası veri kaybının" bir size_t bir bir typedef olduğunda yaşadığını söylüyor unsigned int.

Neden !?

Düzenleme: Sadece kendi sorununu çözdü

. Ben bir XP kullanıcısıyım ve derleyicim 64 bit uyumluluğunu kontrol ediyordu. size_t platform bağımlı olduğundan, 64 bit için unsigned long long olur; bu, unsigned int ile aynı değildir.

+1

Tüm boyutlar bağımlıdır. 'size_t' diğer herhangi bir türe eşit olmak zorunda değildir, hepsi farklı olabilir. Sahip olduğunuz tek garanti, 'sizeof (char) == 1' ve' char'daki bitlerin sayısı (ayrıca bağımlıdır!) '' başlığında 'CHAR_BIT 'makrosunda tanımlanmıştır. ve bu “büyüklük (kısa)> = sizeof (char),” sizeof (int)> = sizeof (uzun), ve 'sizeof (uzun uzun)> = sizeof (uzun). – GManNickG

+0

@GMan: Aslında inanıyorum ki (long)> = sizeof (int) ':) +1 olsa da –

+0

@Billy: Oh dangit. Şimdi düzeltmek için çok geç. -_- Oh iyi. : 3 – GManNickG

cevap

8

unsigned int, makinenizde size_t'dan daha dar bir türdür. Büyük olasılıkla size_t 64 bit, unsigned int ise 32 bittir.

DÜZENLEME: size_t unsigned int.

+0

Eh, 'size_t' _is_ bazı sistemlerde 'imzasız' için bir yazım hatası. Ancak LP64 ve LLP64 sistemlerinde olmayacak. :-) –

+0

@James McNellis: Belki, ama standart bunu böyle tanımlamıyor :) –