2010-08-12 31 views
64

Tôi muốn biết giá trị tối đa của size_t trên hệ thống mà chương trình của tôi đang chạy. bản năng đầu tiên của tôi là sử dụng âm 1, như vậy:Phương pháp di động để tìm giá trị tối đa của size_t là gì?

size_t max_size = (size_t)-1; 

Nhưng tôi đoán có một cách tốt hơn, hoặc một hằng số được xác định ở đâu đó.

+1

Đó là một mẹo rất thông minh bạn có ở đó. +1! – Mhmmd

+0

Vâng, những gì bạn có là tốt (bạn không cần phải đúc, bằng cách này). –

+0

Vì tò mò, tại sao bạn muốn biết điều này? –

Trả lời

64

Hằng số biểu hiện (macro) tồn tại trong C99 và được gọi là SIZE_MAX. Không có hằng số như vậy trong C89/90 mặc dù.

Tuy nhiên, những gì bạn có trong bài đăng gốc là phương pháp hoàn toàn di động để tìm giá trị tối đa là size_t. Nó được đảm bảo để làm việc với bất kỳ loại unsigned.

+0

Cảm ơn bạn, trình biên dịch của tôi cần các diễn viên, hoặc một cảnh báo được ban hành về sự thay đổi của dấu hiệu trong một chuyển đổi số nguyên. – Justicle

+0

Có đúng là hoàn toàn di động không? Điều gì ngăn cản nó trở thành một đại diện bẫy? – jamesdlin

+8

@jamesdlin: Chuyển đổi được ký thành không được ký hiệu luôn luôn được xác định rõ ràng trong C. Nó được yêu cầu tuân theo các quy tắc của các ký hiệu modulo không dấu điển hình với modulo bằng giá trị lớn nhất của loại không dấu mục tiêu cộng 1. Vì vậy, trong ở trên trường hợp bạn sẽ nhận được '-1 mod ( + 1)', luôn luôn là ''. – AnT

12
#define MAZ_SZ (~(size_t)0) 

hoặc SIZE_MAX

3

Các giải pháp được đề xuất bởi size_t max_size = (size_t)-1; OP chắc chắn là tốt nhất cho đến nay, nhưng tôi đã tìm ra khác, phức tạp hơn, cách để làm điều này. Tôi đăng nó chỉ cho sự tò mò học thuật.

#include <limits.h> 

size_t max_size = ((((size_t)1 << (CHAR_BIT * sizeof(size_t) - 1)) - 1) << 1) + 1; 
+12

Nếu tôi nên tìm thấy rằng trong một số mã (đặc biệt là không có một bình luận), nó sẽ làm cho tôi rất gắt gỏng. :) –

4

Để thay thế cho bit hoạt động đề xuất trong các câu trả lời khác, bạn có thể làm điều này trong C++

#include <limits> 
size_t maxvalue = std::numeric_limits<size_t>::max() 
+1

'std :: numeric_limits :: max()' không phải là một 'constexpr', và nó không được tối ưu hóa tốt bởi một số trình biên dịch, như Clang. GCC, ICC và MSC xử lý nó tốt. Nó thường tốt hơn để gắn bó với '# define'. – jww

+1

@jww Có _should_ là một phiên bản 'constexpr' của' max() 'có sẵn: http://en.cppreference.com/w/cpp/types/numeric_limits/max –

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