Đây là một kết quả của C quy tắc khuyến mãi số nguyên. Về cơ bản, hầu hết bất kỳ biến nào đi vào một biểu thức đều được "quảng bá" để các hoạt động như thế này không bị mất chính xác. Sau đó, nó được chuyển thành một số int
thành printf
, theo quy tắc đối số biến của C.
Nếu bạn muốn những gì bạn đang tìm kiếm, bạn sẽ phải đúc lại unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Lưu ý: sử dụng %c
theo quy định tại comment Stephen sẽ không làm việc vì %c
hy vọng một số nguyên quá.
EDIT: Cách khác, bạn có thể làm điều này:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
hoặc
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}
Nguồn
2010-07-30 16:51:49
Không muốn đăng câu trả lời vì tôi không chắc chắn 100%, nhưng không phải vì% d là số nguyên? Vì vậy, đoạn mã đằng sau hậu trường có thể gán 'i << 1' cho một số nguyên để in nó, có nghĩa là nó phù hợp và không tràn. Thử làm 'printf ("% c ", i << 1);'? – Stephen
@Stephen: Đã đăng câu trả lời;) – KevenK
@Stephen: Đầu ra trống khi tôi sử dụng% c. – Variance