Tôi muốn đọc các số nguyên không dấu trong biểu diễn cơ sở 10 (thập phân) từ một iốt luồng C++ với ít nhất là phát hiện lỗi thô sơ. Theo quan điểm của tôi, các dấu trừ sẽ rõ ràng là một lỗi trong trường hợp này, bởi vì các số nguyên chưa ký không có dấu. Tuy nhiên, gcc là một ý kiến khác nhau:Làm cách nào để phát hiện số âm khi phân tích lỗi khi đọc số nguyên không dấu?
#include <iostream>
#include <sstream>
int main() {
std::stringstream a("5"), b("-0"), c("-4");
unsigned int i;
a >> i; if (a) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
b >> i; if (b) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
c >> i; if (c) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
return 0;
}
mang lại cho tôi một đầu ra của
4294967292
cho dòng cuối cùng, như thể một số nguyên ký -4 đã đọc và chuyển đổi sang int unsigned.
Appearently, the GCC people see this as a feature. Có một số tiêu chuẩn bắt buộc hành vi này và có cách nào ngắn viết một trình phân tích cú pháp riêng để thoát khỏi nó, tức là phát hiện "-4" (và có thể "-0") làm lỗi chuyển đổi không?
Bạn đã đăng báo cáo lỗi đúng chưa? Đó là một đánh dấu "cố định" mà không có bất kỳ kháng chiến. – spraff
@spraff: Có vẻ như vậy, điều này đề cập đến hành vi số âm. – thiton