Tôi ngạc nhiên bởi hành vi của C++ khi áp dụng bit-khôn ngoan không cho một unsigned char.C++ - Bit-khôn ngoan không phải của uchar sản xuất int
Lấy giá trị nhị phân 01010101b
, là 0x55
hoặc 85
. Áp dụng bit-khôn ngoan không phải trên một đại diện tám bit nên sản lượng 10101010b
, là 0xAA
, hoặc 170
.
Tuy nhiên, tôi không thể sao chép lại ở trên trong C++. Xác nhận đơn giản sau đây không thành công.
assert(static_cast<unsigned char>(0xAAu) == ~static_cast<unsigned char>(0x55u));
tôi in các giá trị của 0x55
, 0xAA
, và ~0x55
(như uchar) với đoạn mã sau. Và nó cho thấy rằng một chút khôn ngoan không làm những gì tôi mong đợi nó làm.
std::cout << "--> 0x55: " << 0x55u << ", 0xAA: " << 0xAAu << ", ~0x55: "
<< static_cast<unsigned>(~static_cast<unsigned char>(0x55u)) << std::endl;
--> 0x55: 85, 0xAA: 170, ~0x55: 4294967210
Số điện thoại mà được in ra cho ~0x55
bằng 11111111111111111111111110101010b
, đó là 32-bit chút khôn ngoan không của 0x55
. Vì vậy, toán tử ~
đang hoạt động trên các số nguyên 32 bit ngay cả khi tôi truyền đầu vào một cách rõ ràng đến unsigned char
. Tại sao vậy?
Tôi đã áp dụng một thử nghiệm khác để xem loại nhà khai thác ~
trả về loại nào. Và nó hóa ra là int
trên một đầu vào unsigned char
:
template <class T>
struct Print;
// inside main()
Print<decltype(~static_cast<unsigned char>(0x55))> dummy;
sản lượng các lỗi biên dịch sau đây, mà chỉ ra, rằng kết quả là loại int
.
error: implicit instantiation of undefined template 'Print<int>'
Print<decltype(~static_cast<unsigned char>(0x55u))> dummy;
Tôi đang làm gì sai? Hoặc, làm cách nào để có được C++ để sản xuất 0xAA
từ ~0x55
?
Full code đang here
+1: Mặc dù nó có khả năng rõ ràng, nó là đáng nói rằng 'char' unsigned thực sự là (a) chuyển đổi thấp xếp hạng hơn 'int', và (b) đại diện đầy đủ là' int' (tất cả các giá trị 'unsigned char' có thể được biểu diễn dưới dạng' int'). Do đó, quảng cáo là âm thanh. – WhozCraig
@WhozCraig đó là một yêu cầu công bằng, được thực hiện. –
Cảm ơn bạn đã trả lời chi tiết! – Lemming