2010-07-30 50 views
8
#include <stdio.h> 
int main() 
{ 
    unsigned char i=0x80; 
    printf("%d",i<<1); 
    return 0; 
} 

Tại sao chương trình này in 256?Giá trị lớn nhất của unsigned char

Như tôi hiểu điều này, kể từ 0x80 = 0b10000000, và unsigned char đã 8 bit, các '1' nên tràn sau khi rời shift và đầu ra phải là 0, không 256.

+2

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

+0

@Stephen: Đã đăng câu trả lời;) – KevenK

+0

@Stephen: Đầu ra trống khi tôi sử dụng% c. – Variance

Trả lời

14

Đâ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; 
} 
+0

Bạn có thể đúc '(i << 1)' thành 'unsigned char' không? – nmichaels

+0

@Nathon: Đó không phải là những gì tôi đã làm? –

+1

Lạ lùng, tôi phải bật rèm. – nmichaels

0

Đừng quên định dạng đặc biệt để in unsigned.

printf("%u",(unsigned char)(i<<1)); 
+0

Do quy tắc khuyến mãi của C, đối số sẽ rất có thể được chuyển tới' printf' dưới dạng 'signed int', không phải là 'unsigned 'Bạn nên đưa đối số vào một kiểu phù hợp với trình định dạng định dạng. –

Các vấn đề liên quan