Tại sao kết quả ở 2 đoạn code khác nhau?

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?

1 Like

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"?

5 Likes

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;
}
4 Likes

Để 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

  • 0xFFFFFFFE với vxl 32 bit

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

7 Likes

Cảm ơn bạn nhé…

Cảm ơn bạn nhé. Rất dễ hiểu

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?