int main()
{
unsigned char A= -2;
printf("%d",A); // Kết quả 254
return 0;
}
int main()
{
unsigned int A= -2;
printf("%d",A); // Kết quả -2
return 0;
}
int main()
{
unsigned char A= -2;
printf("%d",A); // Kết quả 254
return 0;
}
int main()
{
unsigned int A= -2;
printf("%d",A); // Kết quả -2
return 0;
}
2 đoạn code khác nhau ra 2 kết quả khác nhau thì có gì lạ vậy bạn?
tại sao kiểu unsigned
lại đi gán giá trị âm vào?
tại sao kiểu unsigned char
lại đi in kiểu int
trong "%d"
?
tại sao kiểu unsigned int
lại đi in kiểu int
trong "%d"
?
Bạn tìm hiểu quy tắc ép kiểu. Tùy vào ép về kiểu lớn hơn hay bé hơn. Định dạng trong printf()
cũng sẽ ép kiểu của tham số truyền vào.
Cho bạn đoạn mã này:
#include <stdio.h>
int main(){
int a = -2;
unsigned int i = a;
unsigned char c = a;
printf("UI a: %u\n", a);
printf("I a: %d\n", a);
printf("UI i: %u\n", i);
printf("I i: %d\n", i);
printf("UI c: %u\n", c);
printf("I c: %d\n", c);
return 0;
}
Để hiểu rõ hơn, bạn cần hiểu cách máy tính lưu 1 số trong bộ nhớ:
khi bạn khai báo số -2: máy tính sẽ lưu thành
bạn ép kiểu về char: lấy 8 bit cuối: nên chỉ có 0xFE = 254
Khi bạn dùng printf với format là number ‘%d’ nó convert ngược lại kiểu int, thành 0x000000FE = 254
Cảm ơn bạn nhé…
Cảm ơn bạn nhé. Rất dễ hiểu