Tóm tắt: Tôi đã mong đợi mã: cout < < uint8_t (0); để in "0", nhưng nó không in bất cứ thứ gì.uint8_t iostream behavior
Phiên bản dài: Khi tôi cố gắng phát các đối tượng uint8_t để cout, tôi nhận được các ký tự lạ với gcc. Đây có phải là hành vi mong đợi không? Có thể nào uint8_t là bí danh cho một số loại dựa trên char? Xem các ghi chú của trình biên dịch/hệ thống trong ví dụ mã.
// compile and run with:
// g++ test-uint8.cpp -std=c++11 && ./a.out
// -std=c++0x (for older gcc versions)
/**
* prints out the following with compiler:
* gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)
* on the system:
* Linux 3.7.9-101.fc17.x86_64
* Note that the first print statement uses an unset uint8_t
* and therefore the behaviour is undefined. (Included here for
* completeness)
> g++ test-uint8.cpp -std=c++11 && ./a.out
>>>�<<< >>>194<<<
>>><<< >>>0<<<
>>><<< >>>0<<<
>>><<< >>>0<<<
>>><<< >>>1<<<
>>><<< >>>2<<<
*
**/
#include <cstdint>
#include <iostream>
void print(const uint8_t& n)
{
std::cout << ">>>" << n << "<<< "
<< ">>>" << (unsigned int)(n) << "<<<\n";
}
int main()
{
uint8_t a;
uint8_t b(0);
uint8_t c = 0;
uint8_t d{0};
uint8_t e = 1;
uint8_t f = 2;
for (auto i : {a,b,c,d,e,f})
{
print(i);
}
}
+1 để chỉ ra rằng uint8_t có thể không tồn tại! Không biết điều đó. – Johann
@Johann - đối với hầu hết các lần sử dụng, 'uint_least8_t' là lựa chọn tốt hơn' uint8_t'. –
Việc triển khai được phép cung cấp nhiều loại số nguyên mở rộng không phải là bí danh cho các loại số nguyên chuẩn. Vì vậy, tôi nghĩ về mặt kỹ thuật 'uint8_t' * có thể * là một loại không phải ký tự, mặc dù thường thì không. – aschepler