2013-07-08 77 views
5

Làm cách nào để tìm giá trị số nguyên tối đa của một loại không xác định? Có điều gì hiệu quả hơn điều này không:Cách tìm giá trị tối đa của loại số nguyên không xác định

template<class T> 
T test(T i) { 
    if (((T)-1) > 0) 
     return -1; 
    T max_neg = ~(1 << ((sizeof(T)*8)-1)); 
    T all_ones = -1; 
    T max_pos = all_ones & max_neg; 
    return max_pos; 
} 
+0

Lưu ý: mã đã cho có thể là sai. Thử nghiệm '-1' và trả về đầu tiên cho các loại unsigned là OK, nhưng sau đó: đối với' max_neg': đầu tiên 'CHAR_BIT' có thể lớn hơn' 8', và dù sao bạn đang chuyển '1' thành _sign bit_, mà tôi nghĩ là không xác định; và đối với 'all_ones':' -1' có thể _not_ là "tất cả những cái", ví dụ trên một máy tính bổ sung hoặc ký hiệu và độ lớn của một người. Và đối với logic: có vẻ như 'max_neg' đã bằng' max_pos'. –

Trả lời

21

Sử dụng std::numeric_limits<T>::max(). Vì C++ 11, hàm này là constexpr và do đó được đánh giá tại thời gian biên dịch.

+2

Ngay cả trước C++ 11, chức năng nói chung là nội tuyến, và trình biên dịch sẽ đánh giá nó tại thời gian biên dịch. (Nhưng vì điều này là không cần thiết, bạn không thể sử dụng nó trong ngữ cảnh yêu cầu một hằng số biên dịch.) –

5

std::numeric_limits<T>::max() là điểm khởi đầu tốt.

0

Điều này tốt: std::numeric_limits<T>::max() hoặc nếu bạn thích tăng cường: boost::integer_traits<T>::max().

+0

* "Độ phức tạp tuyến tính cho cả hai." * - Huh, phức tạp tuyến tính về cái gì, đầu vào không tồn tại? Đó là một hằng số đơn giản mà họ trở lại. –

+1

@ChristianRau Pre C++ 11, tiêu chuẩn không áp đặt bất kỳ sự phức tạp nào, do đó, việc triển khai _could_ làm cho nó phức tạp tuyến tính (nói bằng cách tăng cho đến khi tăng dần dẫn đến giá trị nhỏ hơn). Tất nhiên, có lẽ an toàn để nói rằng không ai là ngu ngốc. –

+0

@ChristianRau Bạn nói đúng. – soerium

Các vấn đề liên quan