Tip dönüştürme - imzasız imzalı int/char
Bu aşağıdaki program çalıştırmak için çalıştı:
#include <stdio.h>
int main() {
signed char a = -5;
unsigned char b = -5;
int c = -5;
unsigned int d = -5;
if (a == b)
printf("\r\n char is SAME!!!");
else
printf("\r\n char is DIFF!!!");
if (c == d)
printf("\r\n int is SAME!!!");
else
printf("\r\n int is DIFF!!!");
return 0;
}
Bu program için çıktı alıyorum:
char DİFF!!! int!!!
Neden her ikisi için farklı çıktılar alıyoruz?
Çıktı aşağıdaki gibi olmalıdır ?
char!!! int!!!
15**.
CEVAP
Bu bir C programcısı bilmeniz gereken iki taneler C. çeşitli örtülü tür dönüştürme kuralları yüzündenthe usual arithmetic conversionsvetamsayı promosyonlar(ikincisi eski parçası).
Char bu durumda 4* *türleri var. Bu ikisi deküçük tamsayı türleri. Başka böyle küçük tamsayı türleri bool
short
.promosyon kuralları tamsayıküçük bir tamsayı türü bir operasyon işlenen her türünü imzalandı int
, terfi alacak devlet. Bu tip imzalanmış veya imzalanmamış olsaydı her koşulda olacak.
Bu durumda signed char
işareti korunur ve int
değeri içeren bir -5 terfi olacak. unsigned char
Bu durumda 251 olan bir değer (0xFB ) içerir. int
aynı değeri içeren bir terfi olacak. Size sonuna kadar
if( (int)-5 == (int)251 )
Tamsayı dava türleri 13 ** var. Tamsayı promosyonlar geçerli değildir bu yüzden küçük tamsayı türleri vardır. Bunun yerine, dengeliher zamanki aritmetik dönüşümlereğer iki işlenen varsa aynı "" (boyut) ama farklı, imzalı imzasız işlenen aynı tür dönüştürülür signedness. rütbe durumu , Size sonuna kadar
if( (unsigned int)-5 == (unsigned int)-5)
Char imzalı veya imzasız varsayılan ol...
Neden imzasız taşma tanımlanan davranı...
uint8_t vs imzasız char...
Dönüştürme java char int...
Verimli imzasız-imzalı döküm kaçınarak...