Xem xét một hàm giá trị tuyệt đối tiêu biểu (trong đó vì lợi ích của các đối số kiểu không thể thiếu trong kích thước tối đa là dài):Có cách nào an toàn để lấy giá trị tuyệt đối chưa ký của một số nguyên đã ký, mà không kích hoạt tràn không?
unsigned long abs(long input);
Một thực hiện ngây thơ của điều này có thể giống như thế:
unsigned long abs(long input)
{
if (input >= 0)
{
// input is positive
// We know this is safe, because the maximum positive signed
// integer is always less than the maximum positive unsigned one
return static_cast<unsigned long>(input);
}
else
{
return static_cast<unsigned long>(-input); // ut oh...
}
}
này mã kích hoạt hành vi không xác định, bởi vì sự phủ định của input
có thể tràn, và kích hoạt tràn số nguyên đã ký là hành vi không xác định. Ví dụ, trên máy bổ sung 2s, giá trị tuyệt đối của std::numeric_limits<long>::min()
sẽ lớn hơn std::numeric_limits<long>::max()
.
Tác giả thư viện có thể làm gì để giải quyết vấn đề này?
Câu trả lời hay, mặc dù câu hỏi của riêng bạn, nhưng +1. – Bathsheba