2013-03-23 71 views
7

tôi đang làm việc trên dưới mã:cout không in unsigned char

#include<iostream> 
#include<stdio.h> 

using namespace std; 

main() { 
    unsigned char a; 
    a=1; 
    printf("%d", a); 
    cout<<a; 
} 

Nó được in 1 và một số rác.

Tại sao cout hoạt động như vậy?

+1

Một 'unsigned char' không phải là' int'. Tại sao bạn nói 'printf' nó là? – chris

+0

Bạn mong đợi điều gì từ việc gửi một tệp nhị phân 1 đến stout? –

+1

@chris 'unsigned char' sẽ được thăng thành 'unsigned' trong cuộc gọi printf, vì vậy mã có thể chấp nhận được. – john

Trả lời

3

Bạn cần nhập số a làm số nguyên là cout<< (int)(a);. Với điều này, bạn sẽ quan sát 1 trên đầu ra. Với cout << a;, bản in sẽ là SOH (Start of Heading) tương ứng với giá trị ascii của 1 không thể in và do đó, một số ký tự đặc biệt được quan sát.

EDIT:

Để chính xác hơn, báo cáo kết quả cout nên cout << static_cast<unsigned>(a) như Nawaz đã đề cập.

24

cout << a đang in một giá trị dường như là rác cho bạn. Nó không phải là rác thực sự. Nó chỉ là một ký tự ASCII không thể in được đang được in. Lưu ý rằng ký tự ascii tương ứng với 1 không thể in được. Bạn có thể kiểm tra xem a là có thể in được hoặc không sử dụng, std::isprint như:

std::cout << std::isprint(a) << std::endl; 

Nó sẽ in 0 (đọc: false) cho thấy nhân vật là không thể in được

-

Dù sao, nếu bạn cũng muốn cout của mình để in 1 cũng như sau đó truyền a đến địa chỉ này:

cout << static_cast<unsigned>(a) << std::endl; 
+0

Làm thế nào để in char đã ký trong C++ bằng cout? Điều gì được mong đợi và nó được xác định như thế nào? Ví dụ: ký char a = -50; cout << a; – Rajesh

-1

printf ("% u", a); nó thật đơn giản để thử nó

+0

Bạn có thể giải thích câu trả lời của mình thêm một chút không? – Charlie

+0

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung liên quan đến _why_ và/hoặc _how_ nó trả lời câu hỏi sẽ cải thiện đáng kể giá trị dài hạn của nó. Xin vui lòng [sửa] câu trả lời của bạn để thêm một số lời giải thích. Cụ thể, hãy giải thích tại sao bạn nghĩ rằng '% u' tốt hơn'% hhu' đối với một đối số 'unsigned char'. –

+0

Và điều này không có gì để giải quyết câu hỏi (tại sao toán tử 'cout :: << (unsigned char)' giải thích đối số của nó như một ký tự chứ không phải là giá trị số học?) –

1

Tôi gặp vấn đề tương tự here mà tôi đã quên mất từ ​​lâu. Các giải pháp cho vấn đề này với iostream'scout thể được thực hiện như thế này:

#include<iostream> 
#include<stdio.h> 

main() { 
    unsigned char a; 
    a=1; 
    printf("%d", a); 
    std::cout<< +a << std::endl; 

    return 0; 
} 

thay vì đúc nó trở lại kiểu khác nếu bạn muốn cout để in các giá trị unsigned char như trái ngược với nhân vật ascii. Bạn cần phải promote nó.

Nếu bạn nhận thấy tất cả những gì tôi đã làm là thêm + trước unsigned char. Đây là bổ sung đơn nhất sẽ quảng bá cho unsigned char để cung cấp cho bạn số đại diện thực tế.

Người dùng Baum mit Augen chịu trách nhiệm nhắc tôi về giải pháp này.

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