Tôi đã có đoạn mã sau:MSVC++: lạ với ints unsigned và tràn
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string a = "a";
for(unsigned int i=a.length()-1; i+1 >= 1; --i)
{
if(i >= a.length())
{
cerr << (signed int)i << "?" << endl;
return 0;
}
}
}
Nếu tôi biên dịch trong MSVC với tối ưu hóa đầy đủ, đầu ra tôi nhận được là "-1?". Nếu tôi biên dịch trong chế độ gỡ lỗi (không có tối ưu hóa), tôi không nhận được kết quả đầu ra (dự kiến.)
Tôi nghĩ tiêu chuẩn đảm bảo rằng các số nguyên không dấu bị tràn trong một cách có thể dự đoán được, do đó khi i = (unsigned int) (- 1) , i + 1 = 0 và điều kiện vòng lặp i + 1> = 1 không thành công. Thay vào đó, thử nghiệm là bằng cách nào đó đi qua. Đây có phải là lỗi trình biên dịch hay tôi đang làm gì đó không xác định ở đâu đó?
Hmm. Những người khác (trên các trang web khác nhau) đang trích dẫn phần 4.7 của tiêu chuẩn: http://dev.feuvan.net/docs/isocpp/conv.html Họ đang sử dụng điều này để cho rằng nó được xác định. –
Từ 3.9.1 4, và chú thích của nó, tôi có ấn tượng rằng các số nguyên không dấu là một ngoại lệ: vì 1 được thêm vào trong số học của mod 2^n, kết quả không thể nằm ngoài phạm vi giá trị, phải không? –
Khi chuyển đổi sang loại đã ký (như trong trường hợp ở đây), kết quả được xác định thực hiện. Bởi vì giá trị nằm ngoài phạm vi của * cả hai * loại trong một thao tác đã ký, tôi thực hiện điều này để nằm trong phần 5. Trình biên dịch sai ở đây, một trong hai cách. – greyfade