Đoạn mã sau tạo các kết quả khác nhau trong chế độ gỡ lỗi và chế độ phát hành (sử dụng Visual Studio 2008):
int _tmain(int argc, _TCHAR* argv[])
{
for( int i = 0; i < 17; i++ )
{
int result = i * 16;
if( result > 255 )
{
result = 255;
}
printf("i:%2d, result = %3d\n", i, result) ;
}
return 0;
}
Đầu ra của chế độ gỡ lỗi, như mong đợi:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
Đầu ra của chế độ phát hành, trong đó kết quả i: 15 không chính xác:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
Bằng cách chọn "Tối ưu hóa -> Không tối ưu hóa" trong Visual Studio ở chế độ phát hành, kết quả đầu ra sẽ chính xác. Tuy nhiên tôi muốn biết tại sao quá trình tối ưu hóa có thể dẫn đến đầu ra sai lầm.
Cập nhật:
Theo đề xuất của Mohit JainBy, in bằng:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
Đầu ra chế độ phát hành là chính xác:
i: 0, result = 0, i*16=0
i: 1, result = 16, i*16=16
(...)
i:14, result = 224, i*16=224
i:15, result = 240, i*16=240
i:16, result = 255, i*16=256
i * 16
bài đăng, và kết quả là chính xác.