2010-08-24 27 views
28

pixel_datavector của char.Tại sao printf không in ra chỉ một byte khi in hex?

Khi tôi làm printf(" 0x%1x ", pixel_data[0]) Tôi hy vọng sẽ thấy 0xf5.

Nhưng tôi nhận được 0xfffffff5 như thể tôi đã in ra một số nguyên 4 byte thay vì 1 byte.

Tại sao điều này? Tôi đã cung cấp printf một char để in ra - chỉ có 1 byte, vậy tại sao là printf in 4?

NB. việc thực hiện printf được bao bọc bên trong API của bên thứ ba nhưng chỉ tự hỏi liệu đây có phải là một tính năng của tiêu chuẩn printf không?

+2

Xem thêm: http://stackoverflow.com/questions/3512749/memcpy-adds-ff-ff-ff-to-the-beginning-of-a-byte –

Trả lời

48

Có lẽ bạn đang nhận được một dạng lành tính của hành vi undefined vì modifier %x hy vọng một tham số unsigned intchar thường sẽ được đề bạt lên một int khi truyền cho một varargs chức năng.

Bạn nên đúc một cách rõ ràng char đến một unsigned int để có được kết quả có thể dự đoán:

printf(" 0x%1x ", (unsigned)pixel_data[0]); 

Lưu ý rằng một lĩnh vực rộng của một không phải là rất hữu ích. Nó chỉ xác định số chữ số tối thiểu để hiển thị và ít nhất một chữ số sẽ là cần thiết trong mọi trường hợp.

Nếu char trên nền tảng của bạn được ký thì chuyển đổi này sẽ chuyển đổi giá trị âm char thành giá trị lớn unsigned int (ví dụ: fffffff5). Nếu bạn muốn xử lý giá trị byte dưới dạng giá trị chưa ký và chỉ cần mở rộng khi chuyển đổi sang unsigned int, bạn nên sử dụng unsigned char cho pixel_data hoặc truyền qua unsigned char hoặc sử dụng thao tác che mặt sau khi quảng cáo.

ví dụ:

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]); 

hoặc

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU); 
+0

@charles. Cảm ơn bạn đã giải thích về lý do hàng đầu của 'f'! API của bên thứ ba mà tôi đang sử dụng có loại 'unsigned char' - vì vậy tôi đã thay đổi định nghĩa của mình cho' pixel_data' để sử dụng thay thế này và nhận kết quả tôi cần. – BeeBand

+1

@BeeBand: Hãy cẩn thận, thay đổi thành 'unsigned char' có thể không đủ. Trên hầu hết các nền tảng 'unsigned char' sẽ quảng bá đến' int', không phải 'unsigned int'. –

+0

@Charles - khi tôi không thay đổi thành 'unsigned char' và chỉ làm diễn viên, tôi vẫn nhận được những f hàng đầu. Tôi đoán tôi cần cả hai thay đổi để 'unsigned int' và sử dụng một bitmask là tốt để đảm bảo nó hoạt động trên tất cả các nền tảng. – BeeBand

3

Sau đó, length công cụ sửa đổi là độ dài tối thiểu.

+0

nên 1 là độ dài tối thiểu? Tôi nghĩ rằng công cụ sửa đổi độ dài bằng byte. – BeeBand

+3

Đó là độ dài ký tự. – leppie

+0

Xin lỗi, tôi không hiểu ý bạn là gì. Tại sao điều gì đã xảy ra ngụ ý rằng công cụ sửa đổi 'length' là độ dài tối thiểu? – BeeBand

2

Chiều rộng-specifier trong printf thực ra là chiều rộng tối thiểu. Bạn có thể làm printf(" 0x%2x ", pixel_data[0] & 0xff) để in lowes byte (thông báo 2, để thực sự in hai ký tự nếu pixel_data[0] là ví dụ: 0xffffff02).

7

sử dụng tốt hơn các tiêu chuẩn định dạng cờ

printf(" %#1x ", pixel_data[0]); 

sau đó trình biên dịch của bạn đặt hex-prefix cho bạn.

+0

tuyệt vời! vì không biết điều này, tôi đã sử dụng trình gỡ lỗi ... – Tebe

3

Sử dụng %hhx

printf("%#04hhx ", foo); 
+0

thật đáng tiếc là tôi đang sử dụng API của bên thứ ba để thực thi 'printf' mà dường như không cho phép trình định dạng' hh'. Nhưng tốt để biết về - cảm ơn. – BeeBand

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